4 from enigma import eServiceReference
5 from enigma import eServiceCenter
7 from Components.Sources.Source import Source
8 from Components.config import config
9 from ServiceReference import ServiceReference
10 from RecordTimer import RecordTimerEntry, RecordTimer, AFTEREVENT,parseEvent
11 from Components.config import config
12 from xml.sax.saxutils import unescape
14 import time, string, cgi
17 # import sys, traceback
29 def __init__(self, session,func = LIST):
32 self.session = session
33 self.recordtimer = session.nav.RecordTimer
34 self.epgcache = eEPGCache.getInstance()
35 self.result = False,"unknown command"
37 def handleCommand(self,cmd):
38 if self.func is self.ADDBYID:
39 self.result = self.addTimerByEventID(cmd)
41 elif self.func is self.ADD:
42 self.result = self.addTimer(cmd)
44 elif self.func is self.TVBROWSER:
45 self.result = self.tvBrowser(cmd)
47 elif self.func is self.DEL:
48 self.result = self.delTimer(cmd)
50 elif self.func is self.CHANGE:
51 self.result = self.changeTimer(cmd)
53 elif self.func is self.WRITE:
54 self.result = self.writeTimerList(force=True)
55 elif self.func is self.RECNOW:
57 self.result = self.recordNow(cmd)
59 self.result = False,"unknown command cmd(%s) self.func(%s)" % (cmd, self.func)
61 def delTimer(self,param):
62 # is there an easier and better way? :\
63 print "delTimer",param
65 if param['sRef'] is None:
66 return False,"ServiceReference missing"
68 serviceref = ServiceReference(param['sRef'])
70 if param['begin'] is None:
71 return False,"begin missing"
73 begin = float(param['begin'])
75 if param['end'] is None:
76 return False,"end missing"
78 end = float(param['end'])
82 print "timer_list ", self.recordtimer.timer_list
83 print "processed_timers", self.recordtimer.processed_timers
84 for x in self.recordtimer.timer_list + self.recordtimer.processed_timers:
85 #print "x.begin(%s), x.end(%s), x.service_ref(%s)" % (x.begin, x.end, x.service_ref)
86 if str(x.service_ref) == str(serviceref) and float(x.begin) == begin and float(x.end) == end:
91 if toDelete is not None:
92 self.recordtimer.removeEntry(toDelete)
93 return True,"Timer removed"
95 return False,"Timer not found"
96 print "Timer not found"
98 #self.session.nav.RecordTimer.saveTimer()
100 def tvBrowser(self,param):
101 print "tvbrowser",param
103 """ Therefor the URL's for the tvBrowser-Capture-Driver are:
105 http://dreambox/web/tvbrowser? +
108 &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
110 to zap for some time:
111 &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
114 &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
117 listDate = ['syear','smonth','sday','shour','smin','eyear','emonth','eday','ehour','emin']
118 for element in listDate:
119 if param[element] is None:
120 return False,"%s missing"%element
122 param[element] = int(param[element])
123 param['begin'] = int( time.strftime("%s", time.localtime(time.mktime( (param['syear'], param['smonth'], param['sday'], param['shour'], param['smin'], 0, 0, 0, -1) ) ) ) )
124 param['end'] = int( time.strftime("%s", time.localtime(time.mktime( (param['eyear'], param['emonth'], param['eday'], param['ehour'], param['emin'], 0, 0, 0, -1) ) ) ) )
126 for element in listDate:
129 if param['sRef'] is None:
130 return False,"sRef missing"
132 takeApart = string.split(param['sRef'], '|')
133 if len(takeApart) > 1:
134 param['sRef'] = takeApart[1]
137 if param.has_key('repeated'):
138 repeated = int(param['repeated'])
140 list = ["mo","tu","we","th","fr","sa","su","ms","mf"]
142 if param.has_key(element):
143 number = param[element] or 0
145 repeated = repeated + int(number)
148 param['repeated'] = repeated
150 if param['command'] == "add":
152 return self.addTimer(param)
153 elif param['command'] == "del":
155 return self.delTimer(param)
156 elif param['command'] == "change":
158 return self.changeTimer(param)
160 return False,"command missing"
162 def recordNow(self,param):
163 print "recordNow ",param
166 if param == "undefinitely":
169 serviceref = self.session.nav.getCurrentlyPlayingServiceReference()
171 #assert isinstance(serviceref, ServiceReference)
172 serviceref = ServiceReference(serviceref.toString())
175 service = self.session.nav.getCurrentService()
176 event = self.epgcache.lookupEventTime(serviceref, -1, 0)
178 info = service.info()
179 ev = info.getEvent(0)
185 end = begin + 3600 * 10
186 name = "instant record"
190 if event is not None:
191 curEvent = parseEvent(event)
193 description = curEvent[3]
194 eventid = curEvent[4]
199 return False, "No event found, started recording undefinitely"
201 newtimer = RecordTimerEntry(serviceref, begin, end, name, description, eventid, False, False, 0)
202 newtimer.dontSave = True
203 self.recordtimer.record(newtimer)
205 return True,"recording was startet"
207 def addTimer(self,param):
208 # is there an easier and better way? :\
209 print "addTimer",param
210 if param['sRef'] is None:
211 return False,"ServiceReference missing"
213 serviceref = ServiceReference(param['sRef'])
215 if param['begin'] is None:
216 return False,"begin missing"
218 begin = float(param['begin'])
220 if param['end'] is None:
221 return False,"end missing"
222 elif float(param['end']) > time.time():
223 end = float(param['end'])
225 return False,"end is in the past"
227 if param['name'] is None:
228 return False,"name is missing"
230 print "name1 ",param['name']
231 name = unescape(param['name'])#.encode("UTF-16LE")#.decode('utf-8')
235 if param['description'] is not None:
236 print "description1 ",param['description']
237 description = unescape(param['description'])#.encode("UTF-16LE")#.decode('utf-8')
238 print "description2 ",description
242 if param['disabled'] =="0":
244 elif param['disabled'] =="1":
247 return False,"disabled incorrect"
249 if param['justplay'] == "0":
251 elif param['justplay'] == "1":
254 return False,"justplay incorrect"
256 if param['afterevent'] == "0":
258 elif param['afterevent'] == "1":
260 elif param['afterevent'] == "2":
263 return False,"afterevent incorrect"
266 if param.has_key('repeated'):
267 repeated = int(param['repeated'])
269 newtimer = RecordTimerEntry(serviceref, begin, end, name, description, 0, disabled, justplay, afterevent)
270 newtimer.repeated = repeated
271 self.recordtimer.record(newtimer)
272 #self.session.nav.RecordTimer.saveTimer()
273 return True,"Timer added"
275 def addTimerByEventID(self,param):
276 print "addTimerByEventID",param
277 if param['sRef'] is None:
278 return False,"ServiceReference not set"
279 if param['eventid'] is None:
280 return False,"Eventid not set"
283 if param['justplay'] is not None:
284 if param['justplay'] == "1":
287 epgcache = eEPGCache.getInstance()
288 event = epgcache.lookupEventId(eServiceReference(param['sRef']),int(param['eventid']))
290 return False,"Eventid not found"
291 (begin, end, name, description, eit) =parseEvent(event)
293 print "addTimerByEventID newtimer ",param['sRef'], (begin - (int(config.recording.margin_before.value)*60)), (end + (int(config.recording.margin_after.value)*60)), name, description, eit, False, justplay
294 newtimer = RecordTimerEntry(ServiceReference(param['sRef']), (begin - (int(config.recording.margin_before.value)*60)), (end + (int(config.recording.margin_after.value)*60)), name, description, eit, False, justplay, AFTEREVENT.NONE)
295 #RecordTimerEntry(serviceref, begin, end, name, description, eit, disabled, justplay, afterevent)
297 self.recordtimer.record(newtimer)
298 return True,"Timer added"
300 def changeTimer(self,param):
302 print "changeTimer ",param
304 if int(param['deleteOldOnSave']) == 1:
306 if param['sRef'] is None:
307 return False,"ServiceReference missing"
309 serviceref = ServiceReference(param['sRef'])
311 if param['repeated'] is not None:
312 repeated = int(param['repeated'])
316 if param['begin'] is None:
317 return False,"begin missing"
318 elif time.time() <= float(param['begin']):
319 begin = float(param['begin'])
320 elif time.time() > float(param['begin']) and repeated == 1:
323 return False,"incorrect time begin"
325 if param['end'] is None:
326 return False,"end missing"
327 elif begin < float(param['end']):
328 end = float(param['end'])
330 return False,"incorrect time end"
332 if param['name'] is None:
333 return False,"name is missing"
337 if param['description'] is not None:
338 description = param['description']
342 if param['repeated'] is not None:
343 repeated = int(param['repeated'])
347 if param['disabled'] =="0":
349 elif param['disabled'] =="1":
352 return False,"disabled incorrect"
354 if param['justplay'] == "0":
356 elif param['justplay'] == "1":
359 return False,"justplay incorrect"
361 if param['afterevent'] == "0":
363 elif param['afterevent'] == "1":
365 elif param['afterevent'] == "2":
368 return False,"afterevent incorrect"
370 if param['channelOld'] is None:
371 return False,"channelOld missing"
373 channelOld = ServiceReference(param['channelOld'])
375 if param['beginOld'] is None:
376 return False,"beginOld missing"
378 beginOld = float(param['beginOld'])
380 if param['endOld'] is None:
381 return False,"endOld missing"
383 endOld = float(param['endOld'])
387 #print "beginOld(%s), endOld(%s), channelOld(%s)" % (beginOld, endOld, channelOld)
388 for x in self.recordtimer.timer_list + self.recordtimer.processed_timers:
389 #print "x.begin(%s), x.end(%s), x.service_ref(%s)" % (float(x.begin), float(x.end), x.service_ref)
390 if str(x.service_ref) == str(channelOld) and float(x.begin) == beginOld and float(x.end) == endOld:
393 toChange.service_ref = ServiceReference(param['sRef'])
394 toChange.begin = int(begin)
395 toChange.end = int(end)
397 toChange.description = description
398 toChange.disabled = disabled
399 toChange.justplay = justplay
400 toChange.afterEvent = afterevent
401 toChange.repeated = repeated
402 self.session.nav.RecordTimer.timeChanged(toChange)
403 print "Timer changed"
404 return True,"Timer changed"
407 return False,"error searching for old Timer"
409 return False,"Timer not found"
411 return self.addTimer(param)
413 def writeTimerList(self,force=False):
414 # is there an easier and better way? :\
415 if config.plugins.Webinterface.autowritetimer.value or force:
416 print "Timer.py writing timer to flash"
417 self.session.nav.RecordTimer.saveTimer()
418 return True,"TimerList was saved "
420 return False,"TimerList was not saved "
424 (result,text) = self.result
425 xml = "<e2simplexmlresult>\n"
427 xml += "<e2state>True</e2state>\n"
429 xml += "<e2state>False</e2state>\n"
430 xml += "<e2statetext>%s</e2statetext>\n" % text
431 xml += "</e2simplexmlresult>\n"
434 text = property(getText)
436 ## part for listfiller requests
440 for item in self.recordtimer.timer_list + self.recordtimer.processed_timers:
442 timer.append(item.service_ref)
443 timer.append(item.service_ref.getServiceName())
444 timer.append(item.eit)
445 timer.append(item.name)
446 timer.append(item.description)
447 if item.disabled is True:
451 #timer.append(item.disabled)
453 timer.append(item.begin)
454 timer.append(item.end)
455 timer.append(item.end - item.begin)
456 timer.append(item.start_prepare)
458 if item.justplay is True:
463 timer.append(item.afterEvent)
466 No passing Logevents, because of error:
467 XML-Verarbeitungsfehler: nicht wohlgeformt
468 Adresse: http://dreambox/web/timerlist
469 Zeile Nr. 374, Spalte 259: <e2logentries>[(1171275272, 15, 'record time changed, start prepare is now: Mon Feb 12 12:29:40 2007'), (1171279780, 5, 'activating state 1'), (1171279780, 0, "Filename calculated as: '/hdd/movie/20070212 1230 - DISNEY CHANNEL - Quack Pack - Onkel Donald & Die Boys'"), (1171279780, 3, 'prepare ok, writing meta information to /hdd/movie/20070212 1230 - DISNEY CHANNEL - Quack Pack - Onkel Donald & Die Boys'), (1171279780, 6, 'prepare ok, waiting for begin'), (1171279800, 5, 'activating state 2'), (1171279800, 11, 'start recording'), (1171281900, 5, 'activating state 3'), (1171281900, 12, 'stop recording')]</e2logentries>
470 ------------------------------------------------------------------------------------------------------------
471 No clue, what it could be.
473 #timer.append(item.log_entries)
477 timer.append(item.Filename)
481 timer.append(item.backoff)
484 timer.append(item.next_activation)
488 timer.append(item.first_try_prepare)
489 timer.append(item.state)
490 timer.append(item.repeated)
492 if item.dontSave is True:
496 # timer.append(item.dontSave)
498 timer.append(item.cancelled)
500 if item.eit is not None:
501 event = self.epgcache.lookupEvent(['E',("%s" % item.service_ref ,2,item.eit)])
502 if event[0][0] is not None:
503 timer.append(event[0][0])
510 timer.append("000000")
511 elif item.state == 1:
512 timer.append("00BCBC")
513 elif item.state == 2:
514 timer.append("9F1919")
516 timer.append("00BCBC")
518 if item.disabled is True:
525 timerlist.append(timer)
529 list = property(command)
530 lut = {"ServiceReference":0
546 ,"firstTryPrepare":16
551 ,"DescriptionExtended":21
554 ,"toggleDisabledIMG":24