4 from enigma import eServiceReference
5 from enigma import eServiceCenter
7 from Components.Sources.Source import Source
8 from ServiceReference import ServiceReference
9 from RecordTimer import RecordTimerEntry, RecordTimer, AFTEREVENT,parseEvent
10 from Components.config import config
11 from xml.sax.saxutils import unescape
13 import time, string, cgi
16 # import sys, traceback
28 def __init__(self, session,func = LIST):
31 self.session = session
32 self.recordtimer = session.nav.RecordTimer
33 self.epgcache = eEPGCache.getInstance()
34 self.result = False,"unknown command"
36 def handleCommand(self,cmd):
37 if self.func is self.ADDBYID:
38 self.result = self.addTimerByEventID(cmd)
39 elif self.func is self.ADD:
40 self.result = self.addTimer(cmd)
41 elif self.func is self.TVBROWSER:
42 self.result = self.tvBrowser(cmd)
43 elif self.func is self.DEL:
44 self.result = self.delTimer(cmd)
45 elif self.func is self.CHANGE:
46 self.result = self.changeTimer(cmd)
47 elif self.func is self.WRITE:
48 self.result = self.writeTimerList(cmd)
49 elif self.func is self.RECNOW:
51 self.result = self.recordNow(cmd)
53 self.result = False,"unknown command cmd(%s) self.func(%s)" % (cmd, self.func)
55 def delTimer(self,param):
56 # is there an easier and better way? :\
57 print "delTimer",param
59 if param['sRef'] is None:
60 return False,"ServiceReference missing"
62 serviceref = ServiceReference(param['sRef'])
64 if param['begin'] is None:
65 return False,"begin missing"
67 begin = float(param['begin'])
69 if param['end'] is None:
70 return False,"end missing"
72 end = float(param['end'])
76 print "timer_list ", self.recordtimer.timer_list
77 print "processed_timers", self.recordtimer.processed_timers
78 for x in self.recordtimer.timer_list + self.recordtimer.processed_timers:
79 #print "x.begin(%s), x.end(%s), x.service_ref(%s)" % (x.begin, x.end, x.service_ref)
80 if str(x.service_ref) == str(serviceref) and float(x.begin) == begin and float(x.end) == end:
85 if toDelete is not None:
86 self.recordtimer.removeEntry(toDelete)
87 return True,"Timer removed"
89 return False,"Timer not found"
90 print "Timer not found"
92 #self.session.nav.RecordTimer.saveTimer()
94 def tvBrowser(self,param):
95 print "tvbrowser",param
97 """ Therefor the URL's for the tvBrowser-Capture-Driver are:
99 http://dreambox/web/tvbrowser? +
102 &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
104 to zap for some time:
105 &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
108 &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
111 listDate = ['syear','smonth','sday','shour','smin','eyear','emonth','eday','ehour','emin']
112 for element in listDate:
113 if param[element] is None:
114 return False,"%s missing"%element
116 param[element] = int(param[element])
117 param['begin'] = int( time.strftime("%s", time.localtime(time.mktime( (param['syear'], param['smonth'], param['sday'], param['shour'], param['smin'], 0, 0, 0, -1) ) ) ) )
118 param['end'] = int( time.strftime("%s", time.localtime(time.mktime( (param['eyear'], param['emonth'], param['eday'], param['ehour'], param['emin'], 0, 0, 0, -1) ) ) ) )
120 for element in listDate:
123 if param['sRef'] is None:
124 return False,"sRef missing"
126 takeApart = string.split(param['sRef'], '|')
127 if len(takeApart) > 1:
128 param['sRef'] = takeApart[1]
131 if param.has_key('repeated'):
132 repeated = int(param['repeated'])
134 list = ["mo","tu","we","th","fr","sa","su","ms","mf"]
136 if param.has_key(element):
137 number = param[element] or 0
139 repeated = repeated + int(number)
142 param['repeated'] = repeated
144 if param['command'] == "add":
146 return self.addTimer(param)
147 elif param['command'] == "del":
149 return self.delTimer(param)
150 elif param['command'] == "change":
152 return self.changeTimer(param)
154 return False,"command missing"
156 def recordNow(self,param):
157 print "recordNow ",param
160 if param == "undefinitely":
163 serviceref = self.session.nav.getCurrentlyPlayingServiceReference()
165 #assert isinstance(serviceref, ServiceReference)
166 serviceref = ServiceReference(serviceref.toString())
169 service = self.session.nav.getCurrentService()
170 event = self.epgcache.lookupEventTime(serviceref, -1, 0)
172 info = service.info()
173 ev = info.getEvent(0)
179 end = begin + 3600 * 10
180 name = "instant record"
184 if event is not None:
185 curEvent = parseEvent(event)
187 description = curEvent[3]
188 eventid = curEvent[4]
193 return False, "No event found, started recording undefinitely"
195 newtimer = RecordTimerEntry(serviceref, begin, end, name, description, eventid, False, False, 0)
196 newtimer.dontSave = True
197 self.recordtimer.record(newtimer)
199 return True,"recording was startet"
201 def addTimer(self,param):
202 # is there an easier and better way? :\
203 print "addTimer",param
204 if param['sRef'] is None:
205 return False,"ServiceReference missing"
207 serviceref = ServiceReference(param['sRef'])
209 if param['begin'] is None:
210 return False,"begin missing"
212 begin = float(param['begin'])
214 if param['end'] is None:
215 return False,"end missing"
216 elif float(param['end']) > time.time():
217 end = float(param['end'])
219 return False,"end is in the past"
221 if param['name'] is None:
222 return False,"name is missing"
224 print "name1 ",param['name']
225 name = unescape(param['name'])#.encode("UTF-16LE")#.decode('utf-8')
229 if param['description'] is not None:
230 print "description1 ",param['description']
231 description = unescape(param['description'])#.encode("UTF-16LE")#.decode('utf-8')
232 print "description2 ",description
236 if param['disabled'] =="0":
238 elif param['disabled'] =="1":
241 return False,"disabled incorrect"
243 if param['justplay'] == "0":
245 elif param['justplay'] == "1":
248 return False,"justplay incorrect"
250 if param['afterevent'] == "0":
252 elif param['afterevent'] == "1":
254 elif param['afterevent'] == "2":
257 return False,"afterevent incorrect"
260 if param.has_key('repeated'):
261 repeated = int(param['repeated'])
263 newtimer = RecordTimerEntry(serviceref, begin, end, name, description, 0, disabled, justplay, afterevent)
264 newtimer.repeated = repeated
265 self.recordtimer.record(newtimer)
266 #self.session.nav.RecordTimer.saveTimer()
267 return True,"Timer added"
269 def addTimerByEventID(self,param):
270 print "addTimerByEventID",param
271 if param['sRef'] is None:
272 return False,"ServiceReference not set"
273 if param['eventid'] is None:
274 return False,"Eventid not set"
277 if param['justplay'] is not None:
278 if param['justplay'] == "1":
281 epgcache = eEPGCache.getInstance()
282 event = epgcache.lookupEventId(eServiceReference(param['sRef']),int(param['eventid']))
284 return False,"Eventid not found"
285 (begin, end, name, description, eit) =parseEvent(event)
287 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
288 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)
289 #RecordTimerEntry(serviceref, begin, end, name, description, eit, disabled, justplay, afterevent)
291 self.recordtimer.record(newtimer)
292 return True,"Timer added"
294 def changeTimer(self,param):
296 print "changeTimer ",param
298 if int(param['deleteOldOnSave']) == 1:
300 if param['sRef'] is None:
301 return False,"ServiceReference missing"
303 serviceref = ServiceReference(param['sRef'])
305 if param['repeated'] is not None:
306 repeated = int(param['repeated'])
310 if param['begin'] is None:
311 return False,"begin missing"
312 elif time.time() <= float(param['begin']):
313 begin = float(param['begin'])
314 elif time.time() > float(param['begin']) and repeated == 1:
317 return False,"incorrect time begin"
319 if param['end'] is None:
320 return False,"end missing"
321 elif begin < float(param['end']):
322 end = float(param['end'])
324 return False,"incorrect time end"
326 if param['name'] is None:
327 return False,"name is missing"
331 if param['description'] is not None:
332 description = param['description']
336 if param['repeated'] is not None:
337 repeated = int(param['repeated'])
341 if param['disabled'] =="0":
343 elif param['disabled'] =="1":
346 return False,"disabled incorrect"
348 if param['justplay'] == "0":
350 elif param['justplay'] == "1":
353 return False,"justplay incorrect"
355 if param['afterevent'] == "0":
357 elif param['afterevent'] == "1":
359 elif param['afterevent'] == "2":
362 return False,"afterevent incorrect"
364 if param['channelOld'] is None:
365 return False,"channelOld missing"
367 channelOld = ServiceReference(param['channelOld'])
369 if param['beginOld'] is None:
370 return False,"beginOld missing"
372 beginOld = float(param['beginOld'])
374 if param['endOld'] is None:
375 return False,"endOld missing"
377 endOld = float(param['endOld'])
381 #print "beginOld(%s), endOld(%s), channelOld(%s)" % (beginOld, endOld, channelOld)
382 for x in self.recordtimer.timer_list + self.recordtimer.processed_timers:
383 #print "x.begin(%s), x.end(%s), x.service_ref(%s)" % (float(x.begin), float(x.end), x.service_ref)
384 if str(x.service_ref) == str(channelOld) and float(x.begin) == beginOld and float(x.end) == endOld:
387 toChange.service_ref = ServiceReference(param['sRef'])
388 toChange.begin = int(begin)
389 toChange.end = int(end)
391 toChange.description = description
392 toChange.disabled = disabled
393 toChange.justplay = justplay
394 toChange.afterEvent = afterevent
395 toChange.repeated = repeated
396 self.session.nav.RecordTimer.timeChanged(toChange)
397 print "Timer changed"
398 return True,"Timer changed"
401 return False,"error searching for old Timer"
403 return False,"Timer not found"
405 return self.addTimer(param)
407 def writeTimerList(self,param):
408 # is there an easier and better way? :\
409 print "saveTimerList",param
410 self.session.nav.RecordTimer.saveTimer()
412 return True,"TimerList was saved "
416 (result,text) = self.result
417 xml = "<e2simplexmlresult>\n"
419 xml += "<e2state>True</e2state>\n"
421 xml += "<e2state>False</e2state>\n"
422 xml += "<e2statetext>%s</e2statetext>\n" % text
423 xml += "</e2simplexmlresult>\n"
426 text = property(getText)
428 ## part for listfiller requests
432 for item in self.recordtimer.timer_list + self.recordtimer.processed_timers:
434 timer.append(item.service_ref)
435 timer.append(item.service_ref.getServiceName())
436 timer.append(item.eit)
437 timer.append(item.name)
438 timer.append(item.description)
439 if item.disabled is True:
443 #timer.append(item.disabled)
445 timer.append(item.begin)
446 timer.append(item.end)
447 timer.append(item.end - item.begin)
448 timer.append(item.start_prepare)
450 if item.justplay is True:
455 timer.append(item.afterEvent)
458 No passing Logevents, because of error:
459 XML-Verarbeitungsfehler: nicht wohlgeformt
460 Adresse: http://dreambox/web/timerlist
461 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>
462 ------------------------------------------------------------------------------------------------------------
463 No clue, what it could be.
465 #timer.append(item.log_entries)
469 timer.append(item.Filename)
473 timer.append(item.backoff)
476 timer.append(item.next_activation)
480 timer.append(item.first_try_prepare)
481 timer.append(item.state)
482 timer.append(item.repeated)
484 if item.dontSave is True:
488 # timer.append(item.dontSave)
490 timer.append(item.cancelled)
492 if item.eit is not None:
493 event = self.epgcache.lookupEvent(['E',("%s" % item.service_ref ,2,item.eit)])
494 if event[0][0] is not None:
495 timer.append(event[0][0])
502 timer.append("000000")
503 elif item.state == 1:
504 timer.append("00BCBC")
505 elif item.state == 2:
506 timer.append("9F1919")
508 timer.append("00BCBC")
510 if item.disabled is True:
517 timerlist.append(timer)
521 list = property(command)
522 lut = {"ServiceReference":0
538 ,"firstTryPrepare":16
543 ,"DescriptionExtended":21
546 ,"toggleDisabledIMG":24