Skip to content
Snippets Groups Projects
Commit 4c678f82 authored by David Trattnig's avatar David Trattnig
Browse files

Clean timer queue and scheduling fixes.

parent 19c407f8
No related branches found
No related tags found
No related merge requests found
...@@ -75,7 +75,7 @@ class AuraScheduler(threading.Thread): ...@@ -75,7 +75,7 @@ class AuraScheduler(threading.Thread):
programme: The current radio programme to be played as defined in the local engine database programme: The current radio programme to be played as defined in the local engine database
active_entry(Show, Track): This is a Tuple consisting of the currently played `Show` and `Track` active_entry(Show, Track): This is a Tuple consisting of the currently played `Show` and `Track`
message_timer(Array<threading.Timer>): The message queue of Liquidsoap commands for playlists/tracks to be played message_timer(List<threading.Timer>): The timer queue of Liquidsoap commands for playlists/entries to be played
""" """
redismessenger = None redismessenger = None
job_result = {} job_result = {}
...@@ -140,6 +140,7 @@ class AuraScheduler(threading.Thread): ...@@ -140,6 +140,7 @@ class AuraScheduler(threading.Thread):
while not self.exit_event.is_set(): while not self.exit_event.is_set():
try: try:
seconds_to_wait = int(self.config.get("fetching_frequency")) seconds_to_wait = int(self.config.get("fetching_frequency"))
self.logger.info(SimpleUtil.cyan("== start fetching new schedules =="))
next_time = datetime.datetime.now() + datetime.timedelta(seconds=seconds_to_wait) next_time = datetime.datetime.now() + datetime.timedelta(seconds=seconds_to_wait)
self.logger.info("Fetch new programmes every %ss. Next fetching in %ss." % (str(seconds_to_wait), str(next_time))) self.logger.info("Fetch new programmes every %ss. Next fetching in %ss." % (str(seconds_to_wait), str(next_time)))
self.fetch_new_programme() self.fetch_new_programme()
...@@ -156,9 +157,9 @@ class AuraScheduler(threading.Thread): ...@@ -156,9 +157,9 @@ class AuraScheduler(threading.Thread):
except Exception as e: except Exception as e:
self.logger.critical(SimpleUtil.red("Unhandled error while fetching & scheduling new programme! (%s)" % str(e)), e) self.logger.critical(SimpleUtil.red("Unhandled error while fetching & scheduling new programme! (%s)" % str(e)), e)
self.print_message_queue() self.clean_timer_queue()
self.print_timer_queue()
self.exit_event.wait(seconds_to_wait) self.exit_event.wait(seconds_to_wait)
self.logger.info(SimpleUtil.cyan("== start fetching new schedules =="))
...@@ -330,19 +331,31 @@ class AuraScheduler(threading.Thread): ...@@ -330,19 +331,31 @@ class AuraScheduler(threading.Thread):
def print_message_queue(self): def print_timer_queue(self):
""" """
Prints the current message queue i.e. playlists in the queue to be played. Prints the current timer queue i.e. playlists in the queue to be played.
""" """
message_queue = "" message_queue = ""
messages = sorted(self.message_timer, key=attrgetter('diff')) messages = sorted(self.message_timer, key=attrgetter('diff'))
if not messages: if not messages:
self.logger.warning("There's nothing in the Message Queue!") self.logger.warning("There's nothing in the Timer Queue!")
else: else:
for msg in messages: for msg in messages:
message_queue += str(msg)+"\n" message_queue += str(msg)+"\n"
self.logger.info("Message Queue: \n" + message_queue) self.logger.info("Timer queue: \n" + message_queue)
def clean_timer_queue(self):
"""
Removes inactive timers from the queue.
"""
len_before = len(self.message_timer)
self.message_timer[:] = [m for m in self.message_timer if m.is_alive()]
len_after = len(self.message_timer)
self.logger.info("Removed %s finished timer objects from queue" % (len_before - len_after))
# ------------------------------------------------------------------------------------------ # # ------------------------------------------------------------------------------------------ #
...@@ -601,7 +614,7 @@ class AuraScheduler(threading.Thread): ...@@ -601,7 +614,7 @@ class AuraScheduler(threading.Thread):
if not isinstance(entries, list): if not isinstance(entries, list):
raise ValueError("Invalid Entry Group: %s" % str(entries)) raise ValueError("Invalid Entry Group: %s" % str(entries))
self.set_entry_timer(entries, fade_in, fade_out) self.set_entries_timer(entries, fade_in, fade_out)
# Check if it's the last item, which needs special handling # Check if it's the last item, which needs special handling
if entries[-1] == clean_entries[-1]: if entries[-1] == clean_entries[-1]:
...@@ -612,7 +625,7 @@ class AuraScheduler(threading.Thread): ...@@ -612,7 +625,7 @@ class AuraScheduler(threading.Thread):
def set_entry_timer(self, entries, fade_in, fade_out): def set_entries_timer(self, entries, fade_in, fade_out):
""" """
Creates timer for loading and playing one or multiple entries. Existing timers are Creates timer for loading and playing one or multiple entries. Existing timers are
updated. updated.
...@@ -699,7 +712,8 @@ class AuraScheduler(threading.Thread): ...@@ -699,7 +712,8 @@ class AuraScheduler(threading.Thread):
fade_out_time = 0 fade_out_time = 0
# Stop function to be called when schedule ends # Stop function to be called when schedule ends
def do_stop(entry): def do_stop(entries):
entry = entries[0]
self.logger.info(SimpleUtil.cyan("=== stop('%s') ===" % entry)) self.logger.info(SimpleUtil.cyan("=== stop('%s') ===" % entry))
transition_type = TransitionType.INSTANT transition_type = TransitionType.INSTANT
if fade_out: if fade_out:
...@@ -854,7 +868,7 @@ class AuraScheduler(threading.Thread): ...@@ -854,7 +868,7 @@ class AuraScheduler(threading.Thread):
# Remove it from message queue # Remove it from message queue
self.message_timer.remove(timer) self.message_timer.remove(timer)
self.logger.info("Removed %s timers for: %s" % (str(count), EngineUtil.get_entries_string(timer.entries))) self.logger.info("Stopped %s timers for: %s" % (str(count), EngineUtil.get_entries_string(timer.entries)))
...@@ -932,7 +946,7 @@ class CallFunctionTimer(threading.Timer): ...@@ -932,7 +946,7 @@ class CallFunctionTimer(threading.Timer):
self.logger = logging.getLogger("AuraEngine") self.logger = logging.getLogger("AuraEngine")
self.logger.debug("Executing soundsystem command '%s' in %s seconds..." % (str(func.__name__), str(diff))) self.logger.debug("Executing soundsystem command '%s' in %s seconds..." % (str(func.__name__), str(diff)))
threading.Timer.__init__(self, diff, func, param) threading.Timer.__init__(self, diff, func, (param,))
if not fadein and not fadeout and not switcher and not loader \ if not fadein and not fadeout and not switcher and not loader \
or fadein and fadeout \ or fadein and fadeout \
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment