diff --git a/data/interfaces/default/newsletter_config.html b/data/interfaces/default/newsletter_config.html index 10583707..3c1c68ee 100644 --- a/data/interfaces/default/newsletter_config.html +++ b/data/interfaces/default/newsletter_config.html @@ -50,7 +50,10 @@

Set the schedule for the newsletter. - Set the schedule for the newsletter using a custom crontab. Only standard cron values are valid. + + Set the schedule for the newsletter using a custom crontab. + Click here for a list of supported expressions. +

@@ -481,7 +484,7 @@ }); if (${newsletter['config']['custom_cron']}) { - $('#cron_value').val('${newsletter['cron']}'); + $('#cron_value').val('${newsletter['cron'] | n}'); } else { try { cron_widget.cron('value', '${newsletter['cron']}'); diff --git a/plexpy/newsletter_handler.py b/plexpy/newsletter_handler.py index 69d646d9..05cb52fa 100644 --- a/plexpy/newsletter_handler.py +++ b/plexpy/newsletter_handler.py @@ -17,6 +17,7 @@ from io import open import os +import shlex from apscheduler.triggers.cron import CronTrigger import email.utils @@ -58,25 +59,36 @@ def schedule_newsletters(newsletter_id=None): def schedule_newsletter_job(newsletter_job_id, name='', func=None, remove_job=False, args=None, cron=None): - # apscheduler day_of_week uses 0-6 = mon-sun if cron: - cron = cron.split(' ') - cron[4] = str((int(cron[4]) - 1) % 7) if cron[4].isdigit() else cron[4] - cron = ' '.join(cron) + values = shlex.split(cron) + # apscheduler day_of_week uses 0-6 = mon-sun + values[4] = str((int(values[4]) - 1) % 7) if values[4].isdigit() else values[4] if NEWSLETTER_SCHED.get_job(newsletter_job_id): if remove_job: NEWSLETTER_SCHED.remove_job(newsletter_job_id) logger.info("Tautulli NewsletterHandler :: Removed scheduled newsletter: %s" % name) else: - NEWSLETTER_SCHED.reschedule_job( - newsletter_job_id, args=args, trigger=CronTrigger.from_crontab(cron)) - logger.info("Tautulli NewsletterHandler :: Re-scheduled newsletter: %s" % name) + try: + NEWSLETTER_SCHED.reschedule_job( + newsletter_job_id, args=args, trigger=CronTrigger( + minute=values[0], hour=values[1], day=values[2], month=values[3], day_of_week=values[4] + ) + ) + logger.info("Tautulli NewsletterHandler :: Re-scheduled newsletter: %s" % name) + except ValueError as e: + logger.error("Tautulli NewsletterHandler :: Failed to re-schedule newsletter: %s" % e) elif not remove_job: - NEWSLETTER_SCHED.add_job( - func, args=args, id=newsletter_job_id, trigger=CronTrigger.from_crontab(cron), - misfire_grace_time=None) - logger.info("Tautulli NewsletterHandler :: Scheduled newsletter: %s" % name) + try: + NEWSLETTER_SCHED.add_job( + func, args=args, id=newsletter_job_id, trigger=CronTrigger( + minute=values[0], hour=values[1], day=values[2], month=values[3], day_of_week=values[4] + ), + misfire_grace_time=None + ) + logger.info("Tautulli NewsletterHandler :: Scheduled newsletter: %s" % name) + except ValueError as e: + logger.error("Tautulli NewsletterHandler :: Failed to schedule newsletter: %s" % e) def notify(newsletter_id=None, notify_action=None, **kwargs):