diff --git a/data/interfaces/default/newsletters_table.html b/data/interfaces/default/newsletters_table.html
index 0ef4883f..e28a85a7 100644
--- a/data/interfaces/default/newsletters_table.html
+++ b/data/interfaces/default/newsletters_table.html
@@ -9,6 +9,7 @@ Version: 0.1
DOCUMENTATION :: END
%doc>
+<% from plexpy.newsletter_handler import NEWSLETTER_SCHED %>
% for newsletter in sorted(newsletters_list, key=lambda k: (k['agent_label'], k['friendly_name'], k['id'])):
-
@@ -20,6 +21,14 @@ DOCUMENTATION :: END
${newsletter['agent_label']} (${newsletter['id']})
% endif
+
+ % if NEWSLETTER_SCHED.get_job('newsletter-{}'.format(newsletter['id'])):
+ <% job = NEWSLETTER_SCHED.get_job('newsletter-{}'.format(newsletter['id'])) %>
+
+ % endif
+
% endfor
diff --git a/plexpy/__init__.py b/plexpy/__init__.py
index 49a2e9f3..37bd13a5 100644
--- a/plexpy/__init__.py
+++ b/plexpy/__init__.py
@@ -41,6 +41,7 @@ import database
import libraries
import logger
import mobile_app
+import newsletter_handler
import notification_handler
import notifiers
import plextv
@@ -476,6 +477,9 @@ def start():
analytics_event(category='system', action='start')
+ # Schedule newsletters
+ newsletter_handler.schedule_newsletters()
+
_STARTED = True
diff --git a/plexpy/newsletter_handler.py b/plexpy/newsletter_handler.py
index d3031080..cffd59a3 100644
--- a/plexpy/newsletter_handler.py
+++ b/plexpy/newsletter_handler.py
@@ -27,16 +27,50 @@ import newsletters
NEWSLETTER_SCHED = BackgroundScheduler()
-def schedule_newsletter(newsletter_id, func=None, remove_job=False, args=None, **kwargs):
- if NEWSLETTER_SCHED.get_job(newsletter_id):
+def schedule_newsletters(newsletter_id=None):
+ with plexpy.SCHED_LOCK:
+
+ # Check if scheduler should be started
+ start_jobs = not len(NEWSLETTER_SCHED.get_jobs())
+
+ newsletters_list = newsletters.get_newsletters(newsletter_id=newsletter_id)
+
+ for newsletter in newsletters_list:
+ newsletter_job_name = '{} ({})'.format(newsletter['agent_label'],
+ newsletter['friendly_name'] or newsletter['id'])
+
+ if newsletter['active']:
+ keys = ['minute', 'hour', 'day', 'month', 'day_of_week']
+ values = newsletter['cron'].split()
+ cron = {k: v for k, v in zip(keys, values)}
+
+ schedule_newsletter_job('newsletter-{}'.format(newsletter['id']), name=newsletter_job_name,
+ func=notify, args=[newsletter['id'], 'on_cron'], cron=newsletter['cron'])
+ else:
+ schedule_newsletter_job('newsletter-{}'.format(newsletter['id']), name=newsletter_job_name,
+ remove_job=True)
+
+ # Start scheduler
+ if start_jobs and len(NEWSLETTER_SCHED.get_jobs()):
+ try:
+ NEWSLETTER_SCHED.start()
+ except Exception as e:
+ logger.error(e)
+
+
+def schedule_newsletter_job(newsletter_job_id, name='', func=None, remove_job=False, args=None, cron=None):
+ if NEWSLETTER_SCHED.get_job(newsletter_job_id):
if remove_job:
- NEWSLETTER_SCHED.remove_job(newsletter_id)
+ NEWSLETTER_SCHED.remove_job(newsletter_job_id)
+ logger.info(u"Tautulli NewsletterHandler :: Removed newsletter schedule: %s" % newsletter_job_id)
else:
NEWSLETTER_SCHED.reschedule_job(
- newsletter_id, args=args, trigger=CronTrigger(**kwargs))
+ newsletter_job_id, args=args, trigger=CronTrigger().from_crontab(cron))
+ logger.info(u"Tautulli NewsletterHandler :: Re-scheduled newsletter: %s" % name)
elif not remove_job:
NEWSLETTER_SCHED.add_job(
- func, args=args, id=newsletter_id, trigger=CronTrigger(**kwargs))
+ func, args=args, id=newsletter_job_id, trigger=CronTrigger.from_crontab(cron))
+ logger.info(u"Tautulli NewsletterHandler :: Scheduled newsletter: %s" % name)
def notify(newsletter_id=None, notify_action=None, **kwargs):
@@ -51,7 +85,7 @@ def notify(newsletter_id=None, notify_action=None, **kwargs):
subject_string = kwargs.pop('subject', 'Tautulli Newsletter')
else:
# Get the subject string
- subject_string = newsletter_config['subject']
+ subject_string = newsletter_config['email_config']['subject']
newsletter_agent = newsletters.get_agent_class(agent_id=newsletter_config['agent_id'],
config=newsletter_config['config'],
diff --git a/plexpy/newsletters.py b/plexpy/newsletters.py
index 3e8ff6aa..6a0b14dc 100644
--- a/plexpy/newsletters.py
+++ b/plexpy/newsletters.py
@@ -27,6 +27,7 @@ import database
import helpers
import libraries
import logger
+import newsletter_handler
import notification_handler
import pmsconnect
from notification_handler import PILLOW, get_poster_info
@@ -92,7 +93,7 @@ def get_newsletters(newsletter_id=None):
db = database.MonitorDatabase()
result = db.select('SELECT id, agent_id, agent_name, agent_label, '
- 'friendly_name, active FROM newsletters %s' % where, args=args)
+ 'friendly_name, cron, active FROM newsletters %s' % where, args=args)
return result
@@ -220,6 +221,7 @@ def set_newsletter_config(newsletter_id=None, agent_id=None, **kwargs):
db.upsert(table_name='newsletters', key_dict=keys, value_dict=values)
logger.info(u"Tautulli Newsletters :: Updated newsletter agent: %s (newsletter_id %s)."
% (agent['label'], newsletter_id))
+ newsletter_handler.schedule_newsletters(newsletter_id=newsletter_id)
return True
except Exception as e:
logger.warn(u"Tautulli Newsletters :: Unable to update newsletter agent: %s." % e)
diff --git a/plexpy/notification_handler.py b/plexpy/notification_handler.py
index ab0a80cb..e76e8d2a 100644
--- a/plexpy/notification_handler.py
+++ b/plexpy/notification_handler.py
@@ -1098,7 +1098,7 @@ def get_poster_info(poster_thumb='', poster_key='', poster_title='', art=False,
img = Image.open(poster_file)
img = img.convert("RGBA")
img = img.filter(ImageFilter.GaussianBlur(3)) # 3px blur
- img.putalpha(102) # 40% opacity
+ img.putalpha(64) # 40% opacity
# Save as a png
poster_file_blur = os.path.join(plexpy.CONFIG.CACHE_DIR, 'cache-image-%s.png' % thread_name)