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}&serviceref={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}&serviceref={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}&serviceref={urlencode(channel_name_external, "utf8")}&name={urlencode(title, "utf8")}&description={urlencode(title, "utf8")}&afterevent=0&eit=&disabled=0&justplay=0&repeated=0
112 if param['syear'] is None:
113 return False,"syear missing"
115 syear = int(param['syear'])
118 if param['smonth'] is None:
119 return False,"smonth missing"
121 smonth = int(param['smonth'])
124 if param['sday'] is None:
125 return False,"sday missing"
127 sday = int(param['sday'])
130 if param['shour'] is None:
131 return False,"shour missing"
133 shour = int(param['shour'])
136 if param['smin'] is None:
137 return False,"smin missing"
139 smin = int(param['smin'])
142 if param['eyear'] is None:
143 return False,"eyear missing"
145 eyear = int(param['eyear'])
148 if param['emonth'] is None:
149 return False,"emonth missing"
151 emonth = int(param['emonth'])
154 if param['eday'] is None:
155 return False,"eday missing"
157 eday = int(param['eday'])
160 if param['ehour'] is None:
161 return False,"ehour missing"
163 ehour = int(param['ehour'])
166 if param['emin'] is None:
167 return False,"emin missing"
169 emin = int(param['emin'])
171 # for compatibility reasons
172 if param['sRef'] is None:
173 return False,"ServiceReference missing"
175 takeApart = string.split(param['sRef'], '|')
176 if len(takeApart) > 1:
177 param['sRef'] = takeApart[1]
179 param['begin'] = int( time.strftime("%s", time.localtime(time.mktime( (syear, smonth, sday, shour, smin, 0, 0, 0, 0) ) ) ) )
180 param['end'] = int( time.strftime("%s", time.localtime(time.mktime( (eyear, emonth, eday, ehour, emin, 0, 0, 0, 0) ) ) ) )
182 if param['command'] == "add":
183 return self.addTimer(param)
184 elif param['command'] == "del":
185 return self.delTimer(param)
187 return False,"command missing"
189 def recordNow(self,param):
190 print "recordNow ",param
193 if param == "undefinitely":
196 serviceref = self.session.nav.getCurrentlyPlayingServiceReference()
198 #assert isinstance(serviceref, ServiceReference)
199 serviceref = ServiceReference(serviceref.toString())
202 service = self.session.nav.getCurrentService()
203 event = self.epgcache.lookupEventTime(serviceref, -1, 0)
205 info = service.info()
206 ev = info.getEvent(0)
212 end = begin + 3600 * 10
213 name = "instant record"
217 if event is not None:
218 curEvent = parseEvent(event)
220 description = curEvent[3]
221 eventid = curEvent[4]
226 return False, "No event found, started recording undefinitely"
228 newtimer = RecordTimerEntry(serviceref, begin, end, name, description, eventid, False, False, 0)
229 newtimer.dontSave = True
230 self.recordtimer.record(newtimer)
232 return True,"recording was startet"
234 def addTimer(self,param):
235 # is there an easier and better way? :\
236 print "addTimer",param
237 if param['sRef'] is None:
238 return False,"ServiceReference missing"
240 serviceref = ServiceReference(param['sRef'])
242 if param['begin'] is None:
243 return False,"begin missing"
245 begin = float(param['begin'])
247 if param['end'] is None:
248 return False,"end missing"
249 elif float(param['end']) > time.time():
250 end = float(param['end'])
252 return False,"end is in the past"
254 if param['name'] is None:
255 return False,"name is missing"
257 print "name1 ",param['name']
258 name = unescape(param['name'])#.encode("UTF-16LE")#.decode('utf-8')
262 if param['description'] is not None:
263 print "description1 ",param['description']
264 description = unescape(param['description'])#.encode("UTF-16LE")#.decode('utf-8')
265 print "description2 ",description
269 if param['disabled'] =="0":
271 elif param['disabled'] =="1":
274 return False,"disabled incorrect"
276 if param['justplay'] == "0":
278 elif param['justplay'] == "1":
281 return False,"justplay incorrect"
283 if param['afterevent'] == "0":
285 elif param['afterevent'] == "1":
287 elif param['afterevent'] == "2":
290 return False,"afterevent incorrect"
292 if param['repeated'] is not None:
293 repeated = int(param['repeated'])
297 newtimer = RecordTimerEntry(serviceref, begin, end, name, description, 0, disabled, justplay, afterevent)
298 newtimer.repeated = repeated
299 self.recordtimer.record(newtimer)
300 #self.session.nav.RecordTimer.saveTimer()
301 return True,"Timer added"
303 def addTimerByEventID(self,param):
304 print "addTimerByEventID",param
305 if param['sRef'] is None:
306 return False,"ServiceReference not set"
307 if param['eventid'] is None:
308 return False,"Eventid not set"
311 if param['justplay'] is not None:
312 if param['justplay'] == "1":
315 epgcache = eEPGCache.getInstance()
316 event = epgcache.lookupEventId(eServiceReference(param['sRef']),int(param['eventid']))
318 return False,"Eventid not found"
319 (begin, end, name, description, eit) =parseEvent(event)
321 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
322 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)
323 #RecordTimerEntry(serviceref, begin, end, name, description, eit, disabled, justplay, afterevent)
325 self.recordtimer.record(newtimer)
326 return True,"Timer added"
328 def changeTimer(self,param):
330 print "changeTimer ",param
332 if int(param['deleteOldOnSave']) == 1:
334 if param['sRef'] is None:
335 return False,"ServiceReference missing"
337 serviceref = ServiceReference(param['sRef'])
339 if param['begin'] is None:
340 return False,"begin missing"
341 elif time.time() <= float(param['begin']):
342 begin = float(param['begin'])
344 return False,"incorrect time begin"
346 if param['end'] is None:
347 return False,"end missing"
348 elif begin < float(param['end']):
349 end = float(param['end'])
351 return False,"incorrect time end"
353 if param['name'] is None:
354 return False,"name is missing"
358 if param['description'] is not None:
359 description = param['description']
363 if param['repeated'] is not None:
364 repeated = int(param['repeated'])
368 if param['disabled'] =="0":
370 elif param['disabled'] =="1":
373 return False,"disabled incorrect"
375 if param['justplay'] == "0":
377 elif param['justplay'] == "1":
380 return False,"justplay incorrect"
382 if param['afterevent'] == "0":
384 elif param['afterevent'] == "1":
386 elif param['afterevent'] == "2":
389 return False,"afterevent incorrect"
391 if param['channelOld'] is None:
392 return False,"channelOld missing"
394 channelOld = ServiceReference(param['channelOld'])
396 if param['beginOld'] is None:
397 return False,"beginOld missing"
399 beginOld = float(param['beginOld'])
401 if param['endOld'] is None:
402 return False,"endOld missing"
404 endOld = float(param['endOld'])
408 for x in self.recordtimer.timer_list + self.recordtimer.processed_timers:
409 #print "x.begin(%s), x.end(%s), x.service_ref(%s)" % (x.begin, x.end, x.service_ref)
410 #print "beginOld(%s), endOld(%s), channelOld(%s)" % (beginOld, endOld, channelOld)
411 if str(x.service_ref) == str(channelOld) and float(x.begin) == beginOld and float(x.end) == endOld:
413 toChange.service_ref = ServiceReference(param['sRef'])
414 toChange.begin = int(begin)
415 toChange.end = int(end)
417 toChange.description = description
418 toChange.disabled = disabled
419 toChange.justplay = justplay
420 toChange.afterEvent = afterevent
421 toChange.repeated = repeated
422 self.session.nav.RecordTimer.timeChanged(toChange)
423 print "Timer changed"
424 return True,"Timer changed"
427 return False,"error searching for old Timer"
429 return False,"Timer not found"
430 print "Timer not found"
432 return self.addTimer(param)
434 def writeTimerList(self,param):
435 # is there an easier and better way? :\
436 print "saveTimerList",param
437 self.session.nav.RecordTimer.saveTimer()
439 return True,"TimerList was saved "
443 (result,text) = self.result
444 xml = "<e2simplexmlresult>\n"
446 xml += "<e2state>True</e2state>\n"
448 xml += "<e2state>False</e2state>\n"
449 xml += "<e2statetext>%s</e2statetext>\n" % text
450 xml += "</e2simplexmlresult>\n"
453 text = property(getText)
455 ## part for listfiller requests
459 for item in self.recordtimer.timer_list + self.recordtimer.processed_timers:
461 timer.append(item.service_ref)
462 timer.append(item.service_ref.getServiceName())
463 timer.append(item.eit)
464 timer.append(item.name)
465 timer.append(item.description)
466 if item.disabled is True:
470 #timer.append(item.disabled)
472 timer.append(item.begin)
473 timer.append(item.end)
474 timer.append(item.end - item.begin)
475 timer.append(item.start_prepare)
477 if item.justplay is True:
482 timer.append(item.afterEvent)
485 No passing Logevents, because of error:
486 XML-Verarbeitungsfehler: nicht wohlgeformt
487 Adresse: http://dreambox/web/timerlist
488 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>
489 ------------------------------------------------------------------------------------------------------------
490 No clue, what it could be.
492 #timer.append(item.log_entries)
496 timer.append(item.Filename)
500 timer.append(item.backoff)
503 timer.append(item.next_activation)
507 timer.append(item.first_try_prepare)
508 timer.append(item.state)
509 timer.append(item.repeated)
511 if item.dontSave is True:
515 # timer.append(item.dontSave)
517 timer.append(item.cancelled)
519 if item.eit is not None:
520 event = self.epgcache.lookupEvent(['E',("%s" % item.service_ref ,2,item.eit)])
521 if event[0][0] is not None:
522 timer.append(event[0][0])
529 timer.append("000000")
530 elif item.state == 1:
531 timer.append("00BCBC")
532 elif item.state == 2:
533 timer.append("9F1919")
535 timer.append("00BCBC")
537 if item.disabled is True:
544 timerlist.append(timer)
548 list = property(command)
549 lut = {"ServiceReference":0
565 ,"firstTryPrepare":16
570 ,"DescriptionExtended":21
573 ,"toggleDisabledIMG":24