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)
151 return False,"command missing"
153 def recordNow(self,param):
154 print "recordNow ",param
157 if param == "undefinitely":
160 serviceref = self.session.nav.getCurrentlyPlayingServiceReference()
162 #assert isinstance(serviceref, ServiceReference)
163 serviceref = ServiceReference(serviceref.toString())
166 service = self.session.nav.getCurrentService()
167 event = self.epgcache.lookupEventTime(serviceref, -1, 0)
169 info = service.info()
170 ev = info.getEvent(0)
176 end = begin + 3600 * 10
177 name = "instant record"
181 if event is not None:
182 curEvent = parseEvent(event)
184 description = curEvent[3]
185 eventid = curEvent[4]
190 return False, "No event found, started recording undefinitely"
192 newtimer = RecordTimerEntry(serviceref, begin, end, name, description, eventid, False, False, 0)
193 newtimer.dontSave = True
194 self.recordtimer.record(newtimer)
196 return True,"recording was startet"
198 def addTimer(self,param):
199 # is there an easier and better way? :\
200 print "addTimer",param
201 if param['sRef'] is None:
202 return False,"ServiceReference missing"
204 serviceref = ServiceReference(param['sRef'])
206 if param['begin'] is None:
207 return False,"begin missing"
209 begin = float(param['begin'])
211 if param['end'] is None:
212 return False,"end missing"
213 elif float(param['end']) > time.time():
214 end = float(param['end'])
216 return False,"end is in the past"
218 if param['name'] is None:
219 return False,"name is missing"
221 print "name1 ",param['name']
222 name = unescape(param['name'])#.encode("UTF-16LE")#.decode('utf-8')
226 if param['description'] is not None:
227 print "description1 ",param['description']
228 description = unescape(param['description'])#.encode("UTF-16LE")#.decode('utf-8')
229 print "description2 ",description
233 if param['disabled'] =="0":
235 elif param['disabled'] =="1":
238 return False,"disabled incorrect"
240 if param['justplay'] == "0":
242 elif param['justplay'] == "1":
245 return False,"justplay incorrect"
247 if param['afterevent'] == "0":
249 elif param['afterevent'] == "1":
251 elif param['afterevent'] == "2":
254 return False,"afterevent incorrect"
257 if param.has_key('repeated'):
258 repeated = int(param['repeated'])
260 newtimer = RecordTimerEntry(serviceref, begin, end, name, description, 0, disabled, justplay, afterevent)
261 newtimer.repeated = repeated
262 self.recordtimer.record(newtimer)
263 #self.session.nav.RecordTimer.saveTimer()
264 return True,"Timer added"
266 def addTimerByEventID(self,param):
267 print "addTimerByEventID",param
268 if param['sRef'] is None:
269 return False,"ServiceReference not set"
270 if param['eventid'] is None:
271 return False,"Eventid not set"
274 if param['justplay'] is not None:
275 if param['justplay'] == "1":
278 epgcache = eEPGCache.getInstance()
279 event = epgcache.lookupEventId(eServiceReference(param['sRef']),int(param['eventid']))
281 return False,"Eventid not found"
282 (begin, end, name, description, eit) =parseEvent(event)
284 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
285 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)
286 #RecordTimerEntry(serviceref, begin, end, name, description, eit, disabled, justplay, afterevent)
288 self.recordtimer.record(newtimer)
289 return True,"Timer added"
291 def changeTimer(self,param):
293 print "changeTimer ",param
295 if int(param['deleteOldOnSave']) == 1:
297 if param['sRef'] is None:
298 return False,"ServiceReference missing"
300 serviceref = ServiceReference(param['sRef'])
302 if param['repeated'] is not None:
303 repeated = int(param['repeated'])
307 if param['begin'] is None:
308 return False,"begin missing"
309 elif time.time() <= float(param['begin']):
310 begin = float(param['begin'])
311 elif time.time() > float(param['begin']) and repeated == 1:
314 return False,"incorrect time begin"
316 if param['end'] is None:
317 return False,"end missing"
318 elif begin < float(param['end']):
319 end = float(param['end'])
321 return False,"incorrect time end"
323 if param['name'] is None:
324 return False,"name is missing"
328 if param['description'] is not None:
329 description = param['description']
333 if param['repeated'] is not None:
334 repeated = int(param['repeated'])
338 if param['disabled'] =="0":
340 elif param['disabled'] =="1":
343 return False,"disabled incorrect"
345 if param['justplay'] == "0":
347 elif param['justplay'] == "1":
350 return False,"justplay incorrect"
352 if param['afterevent'] == "0":
354 elif param['afterevent'] == "1":
356 elif param['afterevent'] == "2":
359 return False,"afterevent incorrect"
361 if param['channelOld'] is None:
362 return False,"channelOld missing"
364 channelOld = ServiceReference(param['channelOld'])
366 if param['beginOld'] is None:
367 return False,"beginOld missing"
369 beginOld = float(param['beginOld'])
371 if param['endOld'] is None:
372 return False,"endOld missing"
374 endOld = float(param['endOld'])
378 for x in self.recordtimer.timer_list + self.recordtimer.processed_timers:
379 #print "x.begin(%s), x.end(%s), x.service_ref(%s)" % (x.begin, x.end, x.service_ref)
380 #print "beginOld(%s), endOld(%s), channelOld(%s)" % (beginOld, endOld, channelOld)
381 if str(x.service_ref) == str(channelOld) and float(x.begin) == beginOld and float(x.end) == endOld:
383 toChange.service_ref = ServiceReference(param['sRef'])
384 toChange.begin = int(begin)
385 toChange.end = int(end)
387 toChange.description = description
388 toChange.disabled = disabled
389 toChange.justplay = justplay
390 toChange.afterEvent = afterevent
391 toChange.repeated = repeated
392 self.session.nav.RecordTimer.timeChanged(toChange)
393 print "Timer changed"
394 return True,"Timer changed"
397 return False,"error searching for old Timer"
399 return False,"Timer not found"
400 print "Timer not found"
402 return self.addTimer(param)
404 def writeTimerList(self,param):
405 # is there an easier and better way? :\
406 print "saveTimerList",param
407 self.session.nav.RecordTimer.saveTimer()
409 return True,"TimerList was saved "
413 (result,text) = self.result
414 xml = "<e2simplexmlresult>\n"
416 xml += "<e2state>True</e2state>\n"
418 xml += "<e2state>False</e2state>\n"
419 xml += "<e2statetext>%s</e2statetext>\n" % text
420 xml += "</e2simplexmlresult>\n"
423 text = property(getText)
425 ## part for listfiller requests
429 for item in self.recordtimer.timer_list + self.recordtimer.processed_timers:
431 timer.append(item.service_ref)
432 timer.append(item.service_ref.getServiceName())
433 timer.append(item.eit)
434 timer.append(item.name)
435 timer.append(item.description)
436 if item.disabled is True:
440 #timer.append(item.disabled)
442 timer.append(item.begin)
443 timer.append(item.end)
444 timer.append(item.end - item.begin)
445 timer.append(item.start_prepare)
447 if item.justplay is True:
452 timer.append(item.afterEvent)
455 No passing Logevents, because of error:
456 XML-Verarbeitungsfehler: nicht wohlgeformt
457 Adresse: http://dreambox/web/timerlist
458 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>
459 ------------------------------------------------------------------------------------------------------------
460 No clue, what it could be.
462 #timer.append(item.log_entries)
466 timer.append(item.Filename)
470 timer.append(item.backoff)
473 timer.append(item.next_activation)
477 timer.append(item.first_try_prepare)
478 timer.append(item.state)
479 timer.append(item.repeated)
481 if item.dontSave is True:
485 # timer.append(item.dontSave)
487 timer.append(item.cancelled)
489 if item.eit is not None:
490 event = self.epgcache.lookupEvent(['E',("%s" % item.service_ref ,2,item.eit)])
491 if event[0][0] is not None:
492 timer.append(event[0][0])
499 timer.append("000000")
500 elif item.state == 1:
501 timer.append("00BCBC")
502 elif item.state == 2:
503 timer.append("9F1919")
505 timer.append("00BCBC")
507 if item.disabled is True:
514 timerlist.append(timer)
518 list = property(command)
519 lut = {"ServiceReference":0
535 ,"firstTryPrepare":16
540 ,"DescriptionExtended":21
543 ,"toggleDisabledIMG":24