diff --git a/modules/core/events.py b/modules/core/events.py index 074ae3839f562af1480489aff53030fe586cc958..c8b982fb58a97490ce1320d91b28740081bbab23 100644 --- a/modules/core/events.py +++ b/modules/core/events.py @@ -20,6 +20,8 @@ import logging import datetime +from threading import Thread + from modules.base.utils import SimpleUtil as SU from modules.base.exceptions import NoActiveEntryException from modules.base.mail import AuraMailer @@ -175,78 +177,110 @@ class EngineEventDispatcher(): Args: source (String): The `Entry` object *or* the URI of the media source currently playing """ - self.logger.debug("on_play(..)") - entry = None + def func(self, source): + self.logger.debug("on_play(..)") + entry = None + + if isinstance(source, str): + try: + self.logger.info(SU.pink("Source '%s' started playing. Resolving ..." % source)) + entry = self.player_state.resolve_entry(source) + except NoActiveEntryException: + self.logger.error("Cannot resolve '%s'" % source) + else: + entry = source - if isinstance(source, str): - try: - self.logger.info(SU.pink("Source '%s' started playing. Resolving ..." % source)) - entry = self.player_state.resolve_entry(source) - except NoActiveEntryException: - self.logger.error("Cannot resolve '%s'" % source) - else: - entry = source + # Assign timestamp for play time + entry.entry_start_actual = datetime.datetime.now() + self.call_event("on_play", entry) - # Assign timestamp for play time - entry.entry_start_actual = datetime.datetime.now() - self.call_event("on_play", entry) + thread = Thread(target = func, args = (self, source)) + thread.start() def on_stop(self, entry): """ The entry on the assigned channel has been stopped playing. """ - self.logger.debug("on_stop(..)") - self.call_event("on_stop", entry) + def func(self, entry): + self.logger.debug("on_stop(..)") + self.call_event("on_stop", entry) + + thread = Thread(target = func, args = (self, entry)) + thread.start() def on_idle(self): """ Callend when no entry is playing """ - self.logger.debug("on_idle(..)") - self.logger.error(SU.red("Currently there's nothing playing!")) - self.call_event("on_idle", None) + def func(self): + self.logger.debug("on_idle(..)") + self.logger.error(SU.red("Currently there's nothing playing!")) + self.call_event("on_idle", None) + + thread = Thread(target = func, args = (self, )) + thread.start() def on_schedule_change(self, schedule): """ Called when the playlist or entries of the current schedule have changed. """ - self.logger.debug("on_schedule_change(..)") - self.call_event("on_schedule_change", schedule) + def func(self, schedule): + self.logger.debug("on_schedule_change(..)") + self.call_event("on_schedule_change", schedule) + + thread = Thread(target = func, args = (self, schedule)) + thread.start() def on_queue(self, entries): """ One or more entries have been queued and are currently pre-loaded. """ - self.logger.debug("on_queue(..)") - self.player_state.add_to_history(entries) - self.call_event("on_queue", entries) + def func(self, entries): + self.logger.debug("on_queue(..)") + self.player_state.add_to_history(entries) + self.call_event("on_queue", entries) + + thread = Thread(target = func, args = (self, entries)) + thread.start() def on_sick(self, data): """ Called when the engine is in some unhealthy state. """ - self.logger.debug("on_sick(..)") - self.call_event("on_sick", data) + def func(self, data): + self.logger.debug("on_sick(..)") + self.call_event("on_sick", data) + + thread = Thread(target = func, args = (self, data)) + thread.start() def on_resurrect(self, data): """ Called when the engine turned healthy again after being sick. """ - self.logger.debug("on_resurrect(..)") - self.call_event("on_resurrect", data) + def func(self, data): + self.logger.debug("on_resurrect(..)") + self.call_event("on_resurrect", data) + + thread = Thread(target = func, args = (self, data)) + thread.start() def on_critical(self, subject, message, data=None): """ Callend when some critical event occurs """ - self.logger.debug("on_critical(..)") - if not data: data = "" - self.mailer.send_admin_mail(subject, message + "\n\n" + str(data)) - self.call_event("on_critical", (subject, message, data)) + def func(self, subject, message, data): + self.logger.debug("on_critical(..)") + if not data: data = "" + self.mailer.send_admin_mail(subject, message + "\n\n" + str(data)) + self.call_event("on_critical", (subject, message, data)) + + thread = Thread(target = func, args = (self, subject, message, data)) + thread.start() \ No newline at end of file