Exemple #1
0
    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")
Exemple #2
0
    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")
Exemple #3
0
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")
Exemple #4
0
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")