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
23 def __init__(self, session, func=LIST):
26 self.session = session
27 self.recordtimer = session.nav.RecordTimer
28 self.epgcache = eEPGCache.getInstance()
29 self.res = ( False, "unknown command" )
31 def handleCommand(self, cmd):
32 if self.func is self.ADDBYID:
33 self.res = self.addTimerByEventID(cmd)
36 elif self.func is self.ADD:
37 self.res = self.editTimer(cmd)
40 elif self.func is self.TVBROWSER:
41 self.res = self.tvBrowser(cmd)
44 elif self.func is self.DEL:
45 self.res = self.delTimer(cmd)
48 elif self.func is self.CHANGE:
49 self.res = self.editTimer(cmd)
52 elif self.func is self.WRITE:
53 self.res = self.writeTimerList(force=True)
55 elif self.func is self.RECNOW:
56 self.res = self.recordNow(cmd)
58 elif self.func is self.CLEANUP:
59 self.res = self.cleanupTimer()
62 self.res = ( False, "Unknown function: '%s'" % (self.func) )
64 def cleanupTimer(self):
65 print "[WebComponents.Timer] cleanupTimer"
67 self.session.nav.RecordTimer.cleanup()
68 return ( True, "List of Timers has been cleaned" )
71 def delTimer(self, param):
72 print "[WebComponents.Timer] delTimer"
75 service_ref = ServiceReference(param['sRef'])
77 return ( False, "Missing Parameter: sRef" )
80 begin = int(float(param['begin']))
82 return ( False, "Missing Parameter: begin" )
85 end = int(float(param['end']))
87 return ( False, "Missing Parameter: end" )
90 for timer in self.recordtimer.timer_list + self.recordtimer.processed_timers:
91 if str(timer.service_ref) == str(service_ref) and int(timer.begin) == begin and int(timer.end) == end:
92 self.recordtimer.removeEntry(timer)
93 return True, "The timer '%s' has been deleted successfully" % (timer.name)
95 return ( False, "The timer has NOT been deleted" )
97 return False, "No matching Timer found"
99 def tvBrowser(self, param):
100 """ The URL's for the tvBrowser-Capture-Driver are:
102 http://dreambox/web/tvbrowser? +
105 &command=add&&year={year}&month={month}&day={day}&shour={start_hour}&smin={start_minute}&ehour={end_hour}&emin={end_minute}&sRef={urlencode(channel_name_external, "utf8")}&name={urlencode(title, "utf8")}&description={urlencode(descr, "utf8")}&dirname={dirname}&tags={urlencode("tag1 tag2...", "utf8")}&afterevent=0&eit=&disabled=0&justplay=0&repeated=0
107 to zap for some time:
108 &command=add&&year={year}&month={month}&day={day}&shour={start_hour}&smin={start_minute}&ehour={end_hour}&emin={end_minute}&sRef={urlencode(channel_name_external, "utf8")}&name={urlencode(title, "utf8")}&description={urlencode(descr, "utf8")}&dirname={dirname}&tags={urlencode("tag1 tag2...", "utf8")}&afterevent=0&eit=&disabled=0&justplay=1&repeated=0
111 &command=del&&year={year}&month={month}&day={day}&shour={start_hour}&smin={start_minute}&ehour={end_hour}&emin={end_minute}&sRef={urlencode(channel_name_external, "utf8")}
113 print "[WebComponents.Timer] tvbrowser"
115 listDate = ('year', 'month', 'day', 'shour', 'smin', 'ehour', 'emin')
116 for element in listDate:
117 if param[element] is None:
118 if param['s' + element] is None:
119 return ( False, "%s missing" % element )
121 param[element] = int(param['s' + element])
123 param[element] = int(param[element])
124 param['begin'] = int(mktime((param['year'], param['month'], param['day'], param['shour'], param['smin'], 0, 0, 0, -1)))
125 param['end'] = int(mktime((param['year'], param['month'], param['day'], param['ehour'], param['emin'], 0, 0, 0, -1)))
126 if param['end'] < param['begin']:
127 param['end'] += 86400
128 for element in listDate:
131 if param['sRef'] is None:
132 return ( False, "Missing Parameter: sRef" )
134 takeApart = param['sRef'].split('|')
135 if len(takeApart) > 1:
136 param['sRef'] = takeApart[1]
138 repeated = int(param.get('repeated') or 0)
140 for element in ("mo", "tu", "we", "th", "fr", "sa", "su", "ms", "mf"):
142 number = param[element] or 0
144 repeated = repeated + int(number)
147 param['repeated'] = repeated
149 if param['command'] == "add":
151 return self.editTimer(param)
152 elif param['command'] == "del":
154 return self.delTimer(param)
155 elif param['command'] == "change":
157 return self.editTimer(param)
159 return ( False, "Unknown command: '%s'" % param['command'] )
161 def recordNow(self, param):
163 if param == "undefinitely" or param == "infinite":
164 ret = (True, "Infinite Instant recording started")
167 ret = ( True, "Instant record for current Event started" )
169 serviceref = ServiceReference(self.session.nav.getCurrentlyPlayingServiceReference().toString())
174 service = self.session.nav.getCurrentService()
175 event = service.info().getEvent(0)
177 print "[Webcomponents.Timer] recordNow Exception!"
180 end = begin + 3600 * 10
181 name = "instant record"
185 if event is not None:
186 curEvent = parseEvent(event)
188 description = curEvent[3]
189 eventid = curEvent[4]
194 ret = ( False, "No event found! Not recording!" )
197 location = config.movielist.last_videodir.value
198 timer = RecordTimerEntry(serviceref, begin, end, name, description, eventid, False, False, 0, dirname=location)
199 timer.dontSave = True
200 self.recordtimer.record(timer)
205 #===============================================================================
206 # This Function can add a new or edit an exisiting Timer.
207 # When the Parameter "deleteOldOnSave" is not set, a new Timer will be added.
208 # Otherwise, and if the parameters channelOld, beginOld and endOld are set,
209 # an existing timer with corresponding values will be changed.
210 #===============================================================================
211 def editTimer(self, param):
212 print "[WebComponents.Timer] editTimer"
214 #OK first we need to parse all of your Parameters
215 #For some of them (like afterEvent or justplay) we can use default values
216 #for others (the serviceReference or the Begin/End time of the timer
217 #we have to quit if they are not set/have illegal values
219 if 'sRef' not in param:
220 return ( False, "Missing Parameter: sRef" )
221 service_ref = ServiceReference(param['sRef'])
223 repeated = int(param.get('repeated') or 0)
225 if 'begin' not in param:
226 return ( False, "Missing Parameter: begin" )
227 begin = int(float(param['begin']))
229 if 'end' not in param:
230 return ( False, "Missing Parameter: end" )
231 end = int(float(param['end']))
236 elif tm > begin and tm < end and repeated == 0:
239 return ( False, "Illegal Parameter value for Parameter begin : '%s'" % begin )
241 if 'name' not in param:
242 return ( False, "Missing Parameter: name" )
245 if 'description' not in param:
246 return ( False, "Missing Parameter: description" )
247 description = param['description'].replace("\n", " ")
249 disabled = False #Default to: Enabled
250 if 'disabled' in param:
251 if param['disabled'] == "1":
254 #TODO - maybe we can give the user some useful hint here
257 justplay = False #Default to: Record
258 if 'justplay' in param:
259 if param['justplay'] == "1":
262 afterEvent = 3 #Default to Afterevent: Auto
263 if 'afterevent' in param:
264 if (param['afterevent'] == "0") or (param['afterevent'] == "1") or (param['afterevent'] == "2"):
265 afterEvent = int(param['afterevent'])
267 dirname = config.movielist.last_timer_videodir.value
268 if 'dirname' in param and param['dirname']:
269 dirname = param['dirname']
272 if 'tags' in param and param['tags']:
273 tags = unescape(param['tags']).split(' ')
276 if 'deleteOldOnSave' in param:
277 delold = int(param['deleteOldOnSave'])
279 #Try to edit an existing Timer
281 if 'channelOld' in param and param['channelOld']:
282 channelOld = ServiceReference(param['channelOld'])
284 return ( False, "Missing Parameter: channelOld" )
285 # We do need all of the following Parameters, too, for being able of finding the Timer.
286 # Therefore so we can neither use default values in this part nor can we
287 # continue if a parameter is missing
288 if 'beginOld' not in param:
289 return ( False, "Missing Parameter: beginOld" )
290 beginOld = int(param['beginOld'])
292 if 'endOld' not in param:
293 return ( False, "Missing Parameter: endOld" )
294 endOld = int(param['endOld'])
296 #let's try to find the timer
298 for timer in self.recordtimer.timer_list + self.recordtimer.processed_timers:
299 if str(timer.service_ref) == str(channelOld):
300 if int(timer.begin) == beginOld:
301 if int(timer.end) == endOld:
302 #we've found the timer we've been searching for
303 #Let's apply the new values
304 timer.service_ref = service_ref
305 timer.begin = int(begin)
308 timer.description = description
309 timer.disabled = disabled
310 timer.justplay = justplay
311 timer.afterEvent = afterEvent
312 timer.repeated = repeated
313 timer.dirname = dirname
316 #send the changed timer back to enigma2 and hope it's good
317 self.session.nav.RecordTimer.timeChanged(timer)
318 print "[WebComponents.Timer] editTimer: Timer changed!"
319 return ( True, "Timer %s has been changed!" % (timer.name) )
321 #obviously some value was not good, return an error
322 return ( False, "Changing the timer for '%s' failed!" % name )
324 return ( False, "Could not find timer '%s' with given start and end time!" % name )
326 #Try adding a new Timer
329 #Create a new instance of recordtimerentry
330 timer = RecordTimerEntry(service_ref, begin, end, name, description, 0, disabled, justplay, afterEvent, dirname=dirname, tags=tags)
331 timer.repeated = repeated
333 self.recordtimer.record(timer)
334 return ( True, "Timer added successfully!" )
336 #something went wrong, most possibly one of the given paramater-values was wrong
337 return ( False, "Could not add timer '%s'!" % name )
339 return ( False, "Unexpected Error" )
341 def addTimerByEventID(self, param):
342 print "[WebComponents.Timer] addTimerByEventID", param
343 if param['sRef'] is None:
344 return ( False, "Missing Parameter: sRef" )
345 if param['eventid'] is None:
346 return ( False, "Missing Parameter: eventid" )
349 if param['justplay'] is not None:
350 if param['justplay'] == "1":
353 location = config.movielist.last_timer_videodir.value
354 if 'dirname' in param and param['dirname']:
355 location = param['dirname']
358 if 'tags' in param and param['tags']:
359 tags = unescape(param['tags']).split(' ')
361 epgcache = eEPGCache.getInstance()
362 event = epgcache.lookupEventId(eServiceReference(param['sRef']), int(param['eventid']))
364 return ( False, "EventId not found" )
366 (begin, end, name, description, eit) = parseEvent(event)
368 timer = RecordTimerEntry(ServiceReference(param['sRef']), begin , end, name, description, eit, False, justplay, AFTEREVENT.NONE, dirname=location, tags=tags)
369 self.recordtimer.record(timer)
370 return ( True, "Timer '%s' added" % (timer.name) )
372 def writeTimerList(self, force=False):
373 # is there an easier and better way? :\
374 if config.plugins.Webinterface.autowritetimer.value or force:
375 print "Timer.py writing timer to flash"
376 self.session.nav.RecordTimer.saveTimer()
377 return ( True, "TimerList has been saved " )
379 return ( False, "TimerList has not been saved " )
385 result = property(getResult)
387 ## part for listfiller requests
391 for item in self.recordtimer.timer_list + self.recordtimer.processed_timers:
394 item.service_ref.getServiceName(),
398 "1" if item.disabled else "0",
401 item.end - item.begin,
403 1 if item.justplay else 0,
409 item.first_try_prepare,
412 1 if item.dontSave else 0,
417 timer.append(item.Filename)
418 except AttributeError:
422 timer.append(item.next_activation)
423 except AttributeError:
426 if item.eit is not None:
427 event = self.epgcache.lookupEvent(['EX', ("%s" % item.service_ref , 2, item.eit)])
428 if event and event[0][0] is not None:
429 timer.append(event[0][0])
437 timer.extend(("0", "on"))
439 timer.extend(("1", "off"))
441 timerlist.append(timer)
445 list = property(getList)
447 "ServiceReference":0,
463 "firstTryPrepare":16,
470 "DescriptionExtended":23,
472 "toggleDisabledIMG":25,