3 from enigma import eServiceReference, eEPGCache
4 from Components.Sources.Source import Source
5 from Components.config import config
6 from ServiceReference import ServiceReference
7 from RecordTimer import RecordTimerEntry, RecordTimer, AFTEREVENT, parseEvent
8 from Components.config import config
9 from xml.sax.saxutils import unescape
10 from time import time, strftime, localtime, mktime
11 from string import split
23 def __init__(self, session, func = LIST):
26 self.session = session
27 self.recordtimer = session.nav.RecordTimer
28 self.epgcache = eEPGCache.getInstance()
29 self.result = False,"unknown command"
32 def handleCommand(self, cmd):
33 if self.func is self.ADDBYID:
34 self.result = self.addTimerByEventID(cmd)
36 elif self.func is self.ADD:
37 self.result = self.editTimer(cmd)
39 elif self.func is self.TVBROWSER:
40 self.result = self.tvBrowser(cmd)
42 elif self.func is self.DEL:
43 self.result = self.delTimer(cmd)
45 elif self.func is self.CHANGE:
46 self.result = self.editTimer(cmd)
48 elif self.func is self.WRITE:
49 self.result = self.writeTimerList(force=True)
50 elif self.func is self.RECNOW:
52 self.result = self.recordNow(cmd)
54 self.result = False, "Unknown function: '%s'" %(self.func)
58 def delTimer(self, param):
59 print "[WebComponents.Timer] delTimer"
61 if param.has_key('sRef'):
62 service_ref = ServiceReference(param['sRef'])
64 return False, "Missing Parameter: sRef"
66 if param.has_key('begin'):
67 begin = int(param['begin'])
69 return False, "Missing Parameter: begin"
71 if param.has_key('end'):
72 end = int(param['end'])
74 return False, "Missing Parameter: end"
77 for timer in self.recordtimer.timer_list + self.recordtimer.processed_timers:
78 if str(timer.service_ref) == str(service_ref) and int(timer.begin) == begin and int(timer.end) == end:
79 self.recordtimer.removeEntry(timer)
80 return True, "The timer '%s' has been deleted successfully" %(timer.name)
82 return False, "The timer has NOT been deleted"
84 return False, "No matching Timer found"
87 def tvBrowser(self, param):
88 print "[WebComponents.Timer] tvbrowser"
90 """ The URL's for the tvBrowser-Capture-Driver are:
92 http://dreambox/web/tvbrowser? +
95 &command=add&&syear={start_year}&smonth={start_month}&sday={start_day}&shour={start_hour}&smin={start_minute}&eyear={end_year}&emonth={end_month}&eday={end_day}&ehour={end_hour}&emin={end_minute}&sRef={urlencode(channel_name_external, "utf8")}&name={urlencode(title, "utf8")}&description={urlencode(title, "utf8")}&afterevent=0&eit=&disabled=0&justplay=0&repeated=0
98 &command=add&&syear={start_year}&smonth={start_month}&sday={start_day}&shour={start_hour}&smin={start_minute}&eyear={end_year}&emonth={end_month}&eday={end_day}&ehour={end_hour}&emin={end_minute}&sRef={urlencode(channel_name_external, "utf8")}&name={urlencode(title, "utf8")}&description={urlencode(title, afterevent=0&eit=&disabled=0&justplay=1&repeated=0
101 &command=del&&syear={start_year}&smonth={start_month}&sday={start_day}&shour={start_hour}&smin={start_minute}&eyear={end_year}&emonth={end_month}&eday={end_day}&ehour={end_hour}&emin={end_minute}&sRef={urlencode(channel_name_external, "utf8")}&name={urlencode(title, "utf8")}&description={urlencode(title, "utf8")}&afterevent=0&eit=&disabled=0&justplay=0&repeated=0
104 listDate = ['syear','smonth','sday','shour','smin','eyear','emonth','eday','ehour','emin']
105 for element in listDate:
106 if param[element] is None:
107 return False,"%s missing"%element
109 param[element] = int(param[element])
110 param['begin'] = int( strftime("%s", localtime(mktime( (param['syear'], param['smonth'], param['sday'], param['shour'], param['smin'], 0, 0, 0, -1) ) ) ) )
111 param['end'] = int( strftime("%s", localtime(mktime( (param['eyear'], param['emonth'], param['eday'], param['ehour'], param['emin'], 0, 0, 0, -1) ) ) ) )
113 for element in listDate:
116 if param['sRef'] is None:
117 return False, "Missing Parameter: sRef"
119 takeApart = split(param['sRef'], '|')
120 if len(takeApart) > 1:
121 param['sRef'] = takeApart[1]
124 if param.has_key('repeated'):
125 repeated = int(param['repeated'])
127 list = ["mo","tu","we","th","fr","sa","su","ms","mf"]
129 if param.has_key(element):
130 number = param[element] or 0
132 repeated = repeated + int(number)
135 param['repeated'] = repeated
137 if param['command'] == "add":
139 return self.editTimer(param)
140 elif param['command'] == "del":
142 return self.delTimer(param)
143 elif param['command'] == "change":
145 return self.editTimer(param)
147 return False, "Unknown command: '%s'" %param['command']
149 def recordNow(self,param):
150 print "recordNow ",param
153 if param == "undefinitely":
156 serviceref = self.session.nav.getCurrentlyPlayingServiceReference()
158 #assert isinstance(serviceref, ServiceReference)
159 serviceref = ServiceReference(serviceref.toString())
162 service = self.session.nav.getCurrentService()
163 event = self.epgcache.lookupEventTime(serviceref, -1, 0)
165 info = service.info()
166 ev = info.getEvent(0)
172 end = begin + 3600 * 10
173 name = "instant record"
177 if event is not None:
178 curEvent = parseEvent(event)
180 description = curEvent[3]
181 eventid = curEvent[4]
186 return False, "No event found, started infinite recording"
188 timer = RecordTimerEntry(serviceref, begin, end, name, description, eventid, False, False, 0)
189 timer.dontSave = True
190 self.recordtimer.record(timer)
192 return True, "Instant recording started"
195 #===============================================================================
196 # This Function can add a new or edit an exisiting Timer
197 # When the Parameter "channelOld" is not set, a new Timer will be added to the
199 # IF the parameters channelOld, beginOld and endOld are set
200 # it's an existing timer will be changed (if possible with the given values)
201 #===============================================================================
202 def editTimer(self, param):
203 print "[WebComponents.Timer] editTimer"
205 #OK first we need to parse all of your Parameters
206 #For some of them (like afterEvent or justplay) we can use default values
207 #for others (the serviceReference or the Begin/End time of the timer
208 #we have to quit if they are not set/have illegal values
210 if param.has_key('sRef'):
211 service_ref = ServiceReference(param['sRef'])
213 return False, "Missing Parameter: sRef"
216 if param.has_key('repeated'):
217 repeated = int(param['repeated'])
220 if param.has_key('begin'):
221 begin = int(param['begin'])
224 elif time() > int(begin) and repeated == 0:
227 return False, "Illegal Parameter value for Parameter begin : '%s'" %begin
229 return False, "Missing Parameter: begin"
232 if param.has_key('end'):
233 end = int(param['end'])
235 return False, "Missing Parameter: end"
237 if param.has_key('name'):
240 return False, "Missing Parameter: name"
242 if param.has_key('description'):
243 description = param['description'].replace("\n", " ")
245 return False, "Missing Parameter: description"
247 disabled = False #Default to: Enabled
248 if param.has_key('disabled'):
249 if param['disabled'] == "1":
252 #TODO - maybe we can give the user some useful hint here
255 justplay = False #Default to: Record
256 if param.has_key('justplay'):
257 if param['justplay'] == "1":
260 afterEvent = 3 #Default to Afterevent: Auto
261 if param.has_key('afterevent'):
262 if ( param['afterevent'] == "0") or (param['afterevent'] == "1") or (param['afterevent'] == "2"):
263 afterEvent = int(param['afterevent'])
265 #Try to edit an existing Timer
266 if param.has_key('channelOld'):
267 print "ChannelOld: %s" %param['channelOld']
268 if param['channelOld'] != '':
269 channelOld = ServiceReference(param['channelOld'])
271 # We do need all of the following Parameters, too, for being able of finding the Timer.
272 # Therefore so we can neither use default values in this part nor can we
273 # continue if a parameter is missing
274 if param.has_key('beginOld'):
275 beginOld = int(param['beginOld'])
277 return False, "Missing Parameter: beginOld"
279 if param.has_key('endOld'):
280 endOld = int(param['endOld'])
282 return False, "Missing Parameter: endOld"
284 #let's try to find the timer
286 for timer in self.recordtimer.timer_list + self.recordtimer.processed_timers:
287 if str(timer.service_ref) == str(channelOld):
288 if int(timer.begin) == beginOld:
289 if int(timer.end) == endOld:
290 #we've found the timer we've been searching for
291 #Let's apply the new values
292 timer.service_ref = service_ref
293 timer.begin = int(begin)
296 timer.description = description
297 timer.disabled = disabled
298 timer.justplay = justplay
299 timer.afterEvent = afterEvent
300 timer.repeated = repeated
302 #send the changed timer back to enigma2 and hope it's good
303 self.session.nav.RecordTimer.timeChanged(timer)
304 print "[WebComponents.Timer] editTimer: Timer changed!"
305 return True, "Timer %s has been changed!" %(timer.name)
307 #obviously some value was not good, return an error
308 return False, "Changing the timer for '%s' failed!" %name
310 return False, "Could not find timer '%s' with given start and end time!" %name
312 #Try adding a new Timer
315 #Create a new instance of recordtimerentry
316 timer = RecordTimerEntry(service_ref, begin, end, name, description, 0, disabled, justplay, afterEvent)
317 timer.repeated = repeated
319 self.recordtimer.record(timer)
320 return True, "Timer added successfully!"
322 #something went wrong, most possibly one of the given paramater-values was wrong
323 return False, "Could not add timer '%s'!" %name
325 return False, "Unexpected Error"
328 def addTimerByEventID(self, param):
329 print "[WebComponents.Timer] addTimerByEventID", param
330 if param['sRef'] is None:
331 return False, "Missing Parameter: sRef"
332 if param['eventid'] is None:
333 return False, "Missing Parameter: eventid"
336 if param['justplay'] is not None:
337 if param['justplay'] == "1":
340 epgcache = eEPGCache.getInstance()
341 event = epgcache.lookupEventId(eServiceReference(param['sRef']),int(param['eventid']))
343 return False, "EventId not found"
345 (begin, end, name, description, eit) = parseEvent(event)
347 timer = RecordTimerEntry(ServiceReference(param['sRef']), begin , end, name, description, eit, False, justplay, AFTEREVENT.NONE)
348 self.recordtimer.record(timer)
349 return True, "Timer '%s' added" %(timer.name)
352 def writeTimerList(self, force=False):
353 # is there an easier and better way? :\
354 if config.plugins.Webinterface.autowritetimer.value or force:
355 print "Timer.py writing timer to flash"
356 self.session.nav.RecordTimer.saveTimer()
357 return True, "TimerList was saved "
359 return False, "TimerList was not saved "
363 print "[WebComponents.Timer] result: ", self.result
364 (result, text) = self.result
365 xml = "<e2simplexmlresult>\n"
367 xml += "<e2state>True</e2state>\n"
369 xml += "<e2state>False</e2state>\n"
370 xml += "<e2statetext>%s</e2statetext>\n" % text
371 xml += "</e2simplexmlresult>\n"
374 text = property(getText)
376 ## part for listfiller requests
380 for item in self.recordtimer.timer_list + self.recordtimer.processed_timers:
382 timer.append(item.service_ref)
383 timer.append(item.service_ref.getServiceName())
384 timer.append(item.eit)
385 timer.append(item.name)
386 timer.append(item.description)
387 timer.append(item.dirname)
389 if item.disabled is True:
394 timer.append(item.begin)
395 timer.append(item.end)
396 timer.append(item.end - item.begin)
397 timer.append(item.start_prepare)
399 if item.justplay is True:
404 timer.append(item.afterEvent)
406 timer.append(item.log_entries)
409 timer.append(item.Filename)
413 timer.append(item.backoff)
416 timer.append(item.next_activation)
420 timer.append(item.first_try_prepare)
421 timer.append(item.state)
422 timer.append(item.repeated)
424 if item.dontSave is True:
429 timer.append(item.cancelled)
431 if item.eit is not None:
432 event = self.epgcache.lookupEvent(['EX',("%s" % item.service_ref ,2,item.eit)])
433 if event[0][0] is not None:
434 timer.append(event[0][0])
441 if item.disabled is True:
448 timerlist.append(timer)
452 list = property(command)
454 "ServiceReference":0,
471 "firstTryPrepare":17,
476 "DescriptionExtended":22,
478 "toggleDisabledIMG":24,