def start(self): self.cron_tab = CronTab() log(u"Begin events creation", "global") # Create all crons events self.create_cron_events() # Watch for any planning changes, for dynamic crons reloading thread_wpc = Thread(target=self.watch_planning_changes) thread_wpc.start() # Record events for the playlist thread_plogger = PlaylistLogger().start() Thread(target=log_listeners).start() try: self.cron_tab.run() except KeyboardInterrupt: log(u"EXIT: Shutting down all threads", "global") stop_event.set() thread_wpc.join() thread_plogger.join() log(u"EXIT: Threads shut down, exiting ...", "global")
class Scheduler(object): TYPES_TO_CLASSES = { "single": ProgramSource, "continuous": BackSource, "jingle": JingleSource } def __init__(self, planning): self.planning = planning self.queues = {} self.queues["single"] = RadioQueue(settings.LIQUIDSOAP_PROGRAM_QUEUE_NAME) self.queues["continuous"] = RadioQueue(settings.LIQUIDSOAP_BACK_QUEUE_NAME) self.queues["jingle"] = RadioQueue(settings.LIQUIDSOAP_JINGLES_QUEUE_NAME) def reload_cron_events(self): self.cron_tab.flush() self.create_cron_events() def create_cron_events(self): now = datetime.now() time_now = now.time() now_jingle_source = None now_back_source = None for pe in self.planning.planningelement_set.all(): source = self.TYPES_TO_CLASSES[pe.type](self.queues[pe.type], pe) log(u"treating source {0}".format(pe.source.title), "sources") log(u"type : {0}".format(pe.type), "sources") log(u"time_start : {0}".format(pe.time_start), "sources") if pe.type in ["continuous", "jingle"] \ and pe.time_start < time_now < pe.time_end \ and pe.day == now.weekday() : log(u"putting on play now", "sources") if pe.type == "jingle": now_jingle_source = source else: now_back_source = source else: log(u"adding cron job for time start", "sources") self.cron_tab.add_event(CronEvent( source.set_active, min=pe.time_start.minute, hour=pe.time_start.hour, dow=pe.day)) if now_jingle_source: now_jingle_source.set_active() if now_back_source: now_back_source.set_active() def watch_planning_changes(self): from datetime import date while True: planning_start_event = None if stop_event.isSet(): log(u"EXITING: watch planning changes thread", "global") return log(u"WATCHING for planning changes", "planning", info=True) pse = PlanningStartEvent.objects.filter(when=date.today(), triggered=False) if len(pse) > 0: planning_start_event = pse[0] planning_start_event.planning.set_active() planning_start_event.triggered = True planning_start_event.save() if cache.get('planning_change') or planning_start_event: log(u"PLANNING CHANGED: reloading elements", "planning") # Reset the cache key cache.delete('planning_change') # Get the active planning to get the changes self.planning = Planning.objects.active_planning() # If there is a single program playing, flush it self.queues["single"].flush() # Reload all cron events self.reload_cron_events() sleep(10) def start(self): self.cron_tab = CronTab() log(u"Begin events creation", "global") # Create all crons events self.create_cron_events() # Watch for any planning changes, for dynamic crons reloading thread_wpc = Thread(target=self.watch_planning_changes) thread_wpc.start() # Record events for the playlist thread_plogger = PlaylistLogger().start() Thread(target=log_listeners).start() try: self.cron_tab.run() except KeyboardInterrupt: log(u"EXIT: Shutting down all threads", "global") stop_event.set() thread_wpc.join() thread_plogger.join() log(u"EXIT: Threads shut down, exiting ...", "global")
class Scheduler(object): TYPES_TO_CLASSES = { "single": ProgramSource, "continuous": BackSource, "jingle": JingleSource } def __init__(self, planning): self.planning = planning self.queues = {} self.queues["single"] = RadioQueue( settings.LIQUIDSOAP_PROGRAM_QUEUE_NAME) self.queues["continuous"] = RadioQueue( settings.LIQUIDSOAP_BACK_QUEUE_NAME) self.queues["jingle"] = RadioQueue( settings.LIQUIDSOAP_JINGLES_QUEUE_NAME) def reload_cron_events(self): self.cron_tab.flush() self.create_cron_events() def create_cron_events(self): now = datetime.now() time_now = now.time() now_jingle_source = None now_back_source = None for pe in self.planning.planningelement_set.all(): source = self.TYPES_TO_CLASSES[pe.type](self.queues[pe.type], pe) log(u"treating source {0}".format(pe.source.title), "sources") log(u"type : {0}".format(pe.type), "sources") log(u"time_start : {0}".format(pe.time_start), "sources") if pe.type in ["continuous", "jingle"] \ and pe.time_start < time_now < pe.time_end \ and pe.day == now.weekday() : log(u"putting on play now", "sources") if pe.type == "jingle": now_jingle_source = source else: now_back_source = source else: log(u"adding cron job for time start", "sources") self.cron_tab.add_event( CronEvent(source.set_active, min=pe.time_start.minute, hour=pe.time_start.hour, dow=pe.day)) if now_jingle_source: now_jingle_source.set_active() if now_back_source: now_back_source.set_active() def watch_planning_changes(self): from datetime import date while True: planning_start_event = None if stop_event.isSet(): log(u"EXITING: watch planning changes thread", "global") return log(u"WATCHING for planning changes", "planning", info=True) pse = PlanningStartEvent.objects.filter(when=date.today(), triggered=False) if len(pse) > 0: planning_start_event = pse[0] planning_start_event.planning.set_active() planning_start_event.triggered = True planning_start_event.save() if cache.get('planning_change') or planning_start_event: log(u"PLANNING CHANGED: reloading elements", "planning") # Reset the cache key cache.delete('planning_change') # Get the active planning to get the changes self.planning = Planning.objects.active_planning() # If there is a single program playing, flush it self.queues["single"].flush() # Reload all cron events self.reload_cron_events() sleep(10) def start(self): self.cron_tab = CronTab() log(u"Begin events creation", "global") # Create all crons events self.create_cron_events() # Watch for any planning changes, for dynamic crons reloading thread_wpc = Thread(target=self.watch_planning_changes) thread_wpc.start() # Record events for the playlist thread_plogger = PlaylistLogger().start() Thread(target=log_listeners).start() try: self.cron_tab.run() except KeyboardInterrupt: log(u"EXIT: Shutting down all threads", "global") stop_event.set() thread_wpc.join() thread_plogger.join() log(u"EXIT: Threads shut down, exiting ...", "global")