You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

94 lines
2.3 KiB

from axl.axel import Event
from couchpotato.core.helpers.variable import mergeDicts
14 years ago
from couchpotato.core.logger import CPLog
import threading
14 years ago
import traceback
log = CPLog(__name__)
events = {}
def addEvent(name, handler):
if events.get(name):
e = events[name]
else:
e = events[name] = Event(threads = 20, exc_info = True, traceback = True, lock = threading.RLock())
e += handler
def removeEvent(name, handler):
e = events[name]
e -= handler
def fireEvent(name, *args, **kwargs):
#log.debug('Firing "%s": %s, %s' % (name, args, kwargs))
try:
14 years ago
# Return single handler
single = False
try:
del kwargs['single']
single = True
except: pass
# Merge items
merge = False
try:
del kwargs['merge']
merge = True
except: pass
e = events[name]
e.asynchronous = False
14 years ago
result = e(*args, **kwargs)
14 years ago
if single and not merge:
results = result[0][1]
else:
results = []
for r in result:
if r[0] == True:
results.append(r[1])
else:
errorHandler(r[1])
# Merge dict
if merge and type(results[0]) == dict:
14 years ago
merged = {}
for result in results:
merged = mergeDicts(merged, result)
results = merged
# Merg lists
elif merge and type(results[0]) == list:
merged = []
for result in results:
merged += result
14 years ago
results = merged
14 years ago
return results
except KeyError:
pass
except Exception, e:
14 years ago
log.error('%s: %s' % (name, e))
def fireEventAsync(name, *args, **kwargs):
#log.debug('Async "%s": %s, %s' % (name, args, kwargs))
try:
e = events[name]
e.asynchronous = True
14 years ago
e.error_handler = errorHandler
14 years ago
e(*args, **kwargs)
return True
except Exception, e:
14 years ago
log.error('%s: %s' % (name, e))
def errorHandler(error):
etype, value, tb = error
log.error(''.join(traceback.format_exception(etype, value, tb)))
def getEvent(name):
return events[name]