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

Improved readability. #41

parent 6eafd4eb
No related branches found
No related tags found
No related merge requests found
...@@ -23,8 +23,6 @@ import threading ...@@ -23,8 +23,6 @@ import threading
import time import time
import sqlalchemy import sqlalchemy
from operator import attrgetter
from datetime import datetime, timedelta
from src.base.config import AuraConfig from src.base.config import AuraConfig
from src.base.utils import SimpleUtil as SU from src.base.utils import SimpleUtil as SU
...@@ -41,103 +39,6 @@ from src.scheduling.programme import Programme ...@@ -41,103 +39,6 @@ from src.scheduling.programme import Programme
class TimeslotCommand(EngineExecutor):
"""
Command for triggering start and end of timeslot events.
"""
engine = None
config = None
def __init__(self, engine, timeslot):
"""
Constructor
Args:
engine (Engine): The engine
timeslot (Timeslot): The timeslot which is starting at this time
"""
self.config = AuraConfig()
self.engine = engine
def do_start_timeslot(timeslot):
self.logger.info(SU.cyan(f"=== on_timeslot_start('{timeslot}') ==="))
self.engine.event_dispatcher.on_timeslot_start(timeslot)
def do_end_timeslot(timeslot):
self.logger.info(SU.cyan(f"=== on_timeslot_end('{timeslot}') ==="))
self.engine.event_dispatcher.on_timeslot_end(timeslot)
recent_entry = timeslot.get_recent_entry()
if recent_entry:
self.engine.player.stop(recent_entry, TransitionType.FADE)
else:
self.logger.warning(SU.red(f"Interestingly timeslot {timeslot} has no entry to be faded out?"))
fade_out_time = float(self.config.get("fade_out_time"))
start_fade_out = timeslot.end_unix - fade_out_time
self.logger.info(f"Fading out timeslot in {start_fade_out} seconds at {timeslot.timeslot_end} | Timeslot: {timeslot}")
super().__init__("TIMESLOT", None, timeslot.start_unix, do_start_timeslot, timeslot)
EngineExecutor("TIMESLOT", self, start_fade_out, do_end_timeslot, timeslot)
class PlayCommand(EngineExecutor):
"""
Command for triggering start and end of timeslot events.
"""
engine = None
config = None
def __init__(self, engine, entries):
"""
Constructor
Args:
engine (Engine): The engine
entries (PlaylistEntry): One or more playlist entries to be started
"""
self.config = AuraConfig()
self.engine = engine
def do_preload(entries):
try:
if entries[0].get_content_type() in ResourceClass.FILE.types:
self.logger.info(SU.cyan("=== preload_group('%s') ===" % ResourceUtil.get_entries_string(entries)))
self.engine.player.preload_group(entries, ChannelType.QUEUE)
else:
self.logger.info(SU.cyan("=== preload('%s') ===" % ResourceUtil.get_entries_string(entries)))
self.engine.player.preload(entries[0])
except LoadSourceException as e:
self.logger.critical(SU.red("Could not preload entries %s" % ResourceUtil.get_entries_string(entries)), e)
if entries[-1].status != EntryPlayState.READY:
self.logger.critical(SU.red("Entries didn't reach 'ready' state during preloading (Entries: %s)" % ResourceUtil.get_entries_string(entries)))
def do_play(entries):
self.logger.info(SU.cyan("=== play('%s') ===" % ResourceUtil.get_entries_string(entries)))
if entries[-1].status != EntryPlayState.READY:
# Let 'em play anyway ...
self.logger.critical(SU.red("PLAY: The entry/entries are not yet ready to be played (Entries: %s)" % ResourceUtil.get_entries_string(entries)))
while (entries[-1].status != EntryPlayState.READY):
self.logger.info("PLAY: Wait a little until preloading is done ...")
time.sleep(2)
self.engine.player.play(entries[0], TransitionType.FADE)
self.logger.info(engine.scheduler.timeslot_renderer.get_ascii_timeslots())
start_preload = entries[0].start_unix - self.config.get("preload_offset")
start_play = entries[0].start_unix
super().__init__("PRELOAD", None, start_preload, do_preload, entries)
EngineExecutor("PLAY", self, start_play, do_play, entries)
class AuraScheduler(threading.Thread): class AuraScheduler(threading.Thread):
""" """
Aura Scheduler Class Aura Scheduler Class
...@@ -497,3 +398,118 @@ class AuraScheduler(threading.Thread): ...@@ -497,3 +398,118 @@ class AuraScheduler(threading.Thread):
self.logger.info("Shutting down scheduler ...") self.logger.info("Shutting down scheduler ...")
#
# EngineExecutor Commands
#
class TimeslotCommand(EngineExecutor):
"""
Command for triggering start and end of timeslot events.
"""
engine = None
config = None
def __init__(self, engine, timeslot):
"""
Constructor
Args:
engine (Engine): The engine
timeslot (Timeslot): The timeslot which is starting at this time
"""
self.config = AuraConfig()
self.engine = engine
fade_out_time = float(self.config.get("fade_out_time"))
start_fade_out = timeslot.end_unix - fade_out_time
self.logger.info(f"Fading out timeslot in {start_fade_out} seconds at {timeslot.timeslot_end} | Timeslot: {timeslot}")
super().__init__("TIMESLOT", None, timeslot.start_unix, self.do_start_timeslot, timeslot)
EngineExecutor("TIMESLOT", self, start_fade_out, self.do_end_timeslot, timeslot)
def do_start_timeslot(self, timeslot):
"""
Initiates the start of the timeslot.
"""
self.logger.info(SU.cyan(f"=== on_timeslot_start('{timeslot}') ==="))
self.engine.event_dispatcher.on_timeslot_start(timeslot)
def do_end_timeslot(self, timeslot):
"""
Initiates the end of the timeslot.
"""
self.logger.info(SU.cyan(f"=== on_timeslot_end('{timeslot}') ==="))
self.engine.event_dispatcher.on_timeslot_end(timeslot)
recent_entry = timeslot.get_recent_entry()
if recent_entry:
self.engine.player.stop(recent_entry, TransitionType.FADE)
else:
self.logger.warning(SU.red(f"Interestingly timeslot {timeslot} has no entry to be faded out?"))
class PlayCommand(EngineExecutor):
"""
Command for triggering start and end of timeslot events.
"""
engine = None
config = None
def __init__(self, engine, entries):
"""
Constructor
Args:
engine (Engine): The engine
entries (PlaylistEntry): One or more playlist entries to be started
"""
self.config = AuraConfig()
self.engine = engine
start_preload = entries[0].start_unix - self.config.get("preload_offset")
start_play = entries[0].start_unix
super().__init__("PRELOAD", None, start_preload, self.do_preload, entries)
EngineExecutor("PLAY", self, start_play, self.do_play, entries)
def do_preload(self, entries):
"""
Preload the entries.
"""
try:
if entries[0].get_content_type() in ResourceClass.FILE.types:
self.logger.info(SU.cyan("=== preload_group('%s') ===" % ResourceUtil.get_entries_string(entries)))
self.engine.player.preload_group(entries, ChannelType.QUEUE)
else:
self.logger.info(SU.cyan("=== preload('%s') ===" % ResourceUtil.get_entries_string(entries)))
self.engine.player.preload(entries[0])
except LoadSourceException as e:
self.logger.critical(SU.red("Could not preload entries %s" % ResourceUtil.get_entries_string(entries)), e)
if entries[-1].status != EntryPlayState.READY:
self.logger.critical(SU.red("Entries didn't reach 'ready' state during preloading (Entries: %s)" % ResourceUtil.get_entries_string(entries)))
def do_play(self, entries):
"""
Play the entries.
"""
self.logger.info(SU.cyan("=== play('%s') ===" % ResourceUtil.get_entries_string(entries)))
if entries[-1].status != EntryPlayState.READY:
# Let 'em play anyway ...
self.logger.critical(SU.red("PLAY: The entry/entries are not yet ready to be played (Entries: %s)" % ResourceUtil.get_entries_string(entries)))
while (entries[-1].status != EntryPlayState.READY):
self.logger.info("PLAY: Wait a little until preloading is done ...")
time.sleep(2)
self.engine.player.play(entries[0], TransitionType.FADE)
self.logger.info(self.engine.scheduler.timeslot_renderer.get_ascii_timeslots())
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