1 # -*- coding: UTF-8 -*-
2 # To check if in Standby
6 from enigma import eServiceReference, eServiceCenter
9 from ServiceReference import ServiceReference
12 from EPGRefreshTimer import epgrefreshtimer, EPGRefreshTimerEntry, checkTimespan
14 # To calculate next timer execution
18 from xml.etree.cElementTree import parse as cet_parse
19 from os import path as path
21 # We want a list of unique services
22 from EPGRefreshService import EPGRefreshService
25 from Components.config import config
27 # Path to configuration
28 CONFIG = "/etc/enigma2/epgrefresh.xml"
31 """Simple Class to refresh EPGData"""
35 self.services = (set(), set())
36 self.previousService = None
37 self.forcedScan = False
39 self.beginOfTimespan = 0
41 # Mtime of configuration files
44 # Read in Configuration
45 self.readConfiguration()
47 def readConfiguration(self):
48 # Check if file exists
49 if not path.exists(CONFIG):
52 # Check if file did not change
53 mtime = path.getmtime(CONFIG)
54 if mtime == self.configMtime:
58 self.configMtime = mtime
61 self.services[0].clear()
62 self.services[1].clear()
65 configuration= cet_parse(CONFIG).getroot()
68 for service in configuration.findall("service"):
71 # strip all after last : (custom name)
72 pos = value.rfind(':')
76 duration = service.get('duration', None)
77 duration = duration and int(duration)
79 self.services[0].add(EPGRefreshService(value, duration))
80 for bouquet in configuration.findall("bouquet"):
83 duration = bouquet.get('duration', None)
84 duration = duration and int(duration)
85 self.services[1].add(EPGRefreshService(value, duration))
87 def saveConfiguration(self):
88 # Generate List in RAM
89 list = ['<?xml version="1.0" ?>\n<epgrefresh>\n\n']
91 for service in self.services[0]:
92 ref = ServiceReference(service.sref)
93 list.extend([' <!-- ', ref.getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', ''), ' -->\n'])
94 list.append(' <service')
95 if service.duration is not None:
96 list.extend([' duration="', str(service.duration), '"'])
97 list.extend(['>', service.sref, '</service>\n'])
98 for bouquet in self.services[1]:
99 ref = ServiceReference(bouquet.sref)
100 list.extend([' <!-- ', ref.getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', ''), ' -->\n'])
101 list.append(' <bouquet')
102 if bouquet.duration is not None:
103 list.extend([' duration="', str(bouquet.duration), '"'])
104 list.extend(['>', bouquet.sref, '</bouquet>\n'])
106 list.append('\n</epgrefresh>')
109 file = open(CONFIG, 'w')
110 file.writelines(list)
114 def forceRefresh(self, session = None):
115 print "[EPGRefresh] Forcing start of EPGRefresh"
116 if session is not None:
117 self.session = session
119 self.forcedScan = True
120 self.prepareRefresh()
122 def start(self, session = None):
123 if session is not None:
124 self.session = session
126 epgrefreshtimer.setRefreshTimer(self.createWaitTimer)
129 print "[EPGRefresh] Stopping Timer"
130 epgrefreshtimer.clear()
132 def prepareRefresh(self):
133 print "[EPGRefresh] About to start refreshing EPG"
136 self.previousService = self.session.nav.getCurrentlyPlayingServiceReference()
138 # Maybe read in configuration
140 self.readConfiguration()
142 print "[EPGRefresh] Error occured while reading in configuration:", e
144 # This will hold services which are not explicitely in our list
145 additionalServices = []
146 additionalBouquets = []
148 # See if we are supposed to read in autotimer services
149 if config.plugins.epgrefresh.inherit_autotimer.value:
150 removeInstance = False
153 from Plugins.Extensions.AutoTimer.plugin import autotimer
155 if autotimer is None:
156 removeInstance = True
158 from Plugins.Extensions.AutoTimer.AutoTimer import AutoTimer
159 autotimer = AutoTimer()
161 # Read in configuration
164 print "[EPGRefresh] Could not inherit AutoTimer Services:", e
167 for timer in autotimer.getEnabledTimerList():
168 additionalServices.extend([EPGRefreshService(x, None) for x in timer.services])
169 additionalBouquets.extend([EPGRefreshService(x, None) for x in timer.bouquets])
171 # Remove instance if there wasn't one before
175 serviceHandler = eServiceCenter.getInstance()
176 for bouquet in self.services[1].union(additionalBouquets):
177 myref = eServiceReference(bouquet.sref)
178 list = serviceHandler.list(myref)
182 # TODO: I wonder if its sane to assume we get services here (and not just new lists)
184 additionalServices.append(EPGRefreshService(s.toString(), None))
187 del additionalBouquets[:]
191 for scanservice in self.services[0].union(additionalServices):
192 service = eServiceReference(scanservice.sref)
193 if not service.valid() \
194 or (service.flags & (eServiceReference.isMarker|eServiceReference.isDirectory)):
198 channelID = '%08x%04x%04x' % (
199 service.getUnsignedData(4), # NAMESPACE
200 service.getUnsignedData(2), # TSID
201 service.getUnsignedData(3), # ONID
204 if channelID not in channelIdList:
205 scanServices.append(scanservice)
206 channelIdList.append(channelID)
207 del additionalServices[:]
210 #print "[EPGRefresh] Services we're going to scan:", ', '.join([repr(x) for x in scanServices])
212 self.scanServices = scanServices
216 config.plugins.epgrefresh.lastscan.value = int(time())
217 config.plugins.epgrefresh.lastscan.save()
219 # shutdown if we're supposed to go to deepstandby and not recording
220 if not self.forcedScan and config.plugins.epgrefresh.afterevent.value \
221 and not Screens.Standby.inTryQuitMainloop:
224 Screens.Standby.TryQuitMainloop,
228 self.forcedScan = False
229 epgrefreshtimer.cleanup()
232 if self.previousService is not None or Screens.Standby.inStandby:
233 self.session.nav.playService(self.previousService)
239 # Abort if a scan finished later than our begin of timespan
240 if self.beginOfTimespan < config.plugins.epgrefresh.lastscan.value:
242 if config.plugins.epgrefresh.force.value \
243 or (Screens.Standby.inStandby and \
244 not self.session.nav.RecordTimer.isRecording()):
247 # We don't follow our rules here - If the Box is still in Standby and not recording we won't reach this line
249 if not checkTimespan(
250 config.plugins.epgrefresh.begin.value,
251 config.plugins.epgrefresh.end.value):
253 print "[EPGRefresh] Gone out of timespan while refreshing, sorry!"
256 print "[EPGRefresh] Box no longer in Standby or Recording started, rescheduling"
259 epgrefreshtimer.add(EPGRefreshTimerEntry(
260 time() + config.plugins.epgrefresh.delay_standby.value*60,
265 def createWaitTimer(self):
266 self.beginOfTimespan = time()
268 # Add wait timer to epgrefreshtimer
269 epgrefreshtimer.add(EPGRefreshTimerEntry(time() + 30, self.prepareRefresh))
271 def nextService(self):
273 print "[EPGRefresh] Maybe zap to next service"
277 service = self.scanServices.pop(0)
280 print "[EPGRefresh] Done refreshing EPG"
286 self.session.nav.playService(eServiceReference(service.sref))
289 delay = service.duration or config.plugins.epgrefresh.interval.value
290 epgrefreshtimer.add(EPGRefreshTimerEntry(
296 epgrefresh = EPGRefresh()