mirror of
https://github.com/Tautulli/Tautulli.git
synced 2025-07-08 06:00:51 -07:00
Schedule newsletters
This commit is contained in:
parent
2a24ea4cdf
commit
46f7a92c97
5 changed files with 57 additions and 8 deletions
|
@ -9,6 +9,7 @@ Version: 0.1
|
||||||
DOCUMENTATION :: END
|
DOCUMENTATION :: END
|
||||||
</%doc>
|
</%doc>
|
||||||
|
|
||||||
|
<% from plexpy.newsletter_handler import NEWSLETTER_SCHED %>
|
||||||
<ul class="stacked-configs list-unstyled">
|
<ul class="stacked-configs list-unstyled">
|
||||||
% for newsletter in sorted(newsletters_list, key=lambda k: (k['agent_label'], k['friendly_name'], k['id'])):
|
% for newsletter in sorted(newsletters_list, key=lambda k: (k['agent_label'], k['friendly_name'], k['id'])):
|
||||||
<li class="newsletter-agent" data-id="${newsletter['id']}">
|
<li class="newsletter-agent" data-id="${newsletter['id']}">
|
||||||
|
@ -20,6 +21,14 @@ DOCUMENTATION :: END
|
||||||
${newsletter['agent_label']} <span class="friendly_name">(${newsletter['id']})</span>
|
${newsletter['agent_label']} <span class="friendly_name">(${newsletter['id']})</span>
|
||||||
% endif
|
% endif
|
||||||
<span class="toggle-right"><i class="fa fa-lg fa-cog"></i></span>
|
<span class="toggle-right"><i class="fa fa-lg fa-cog"></i></span>
|
||||||
|
<span class="toggle-right friendly_name" id="newsletter-next_run-${newsletter['id']}">
|
||||||
|
% if NEWSLETTER_SCHED.get_job('newsletter-{}'.format(newsletter['id'])):
|
||||||
|
<% job = NEWSLETTER_SCHED.get_job('newsletter-{}'.format(newsletter['id'])) %>
|
||||||
|
<script>
|
||||||
|
$("#newsletter-next_run-${newsletter['id']}").text(moment("${job.next_run_time}", "YYYY-MM-DD HH:mm:ssZ").fromNow())
|
||||||
|
</script>
|
||||||
|
% endif
|
||||||
|
</span>
|
||||||
</span>
|
</span>
|
||||||
</li>
|
</li>
|
||||||
% endfor
|
% endfor
|
||||||
|
|
|
@ -41,6 +41,7 @@ import database
|
||||||
import libraries
|
import libraries
|
||||||
import logger
|
import logger
|
||||||
import mobile_app
|
import mobile_app
|
||||||
|
import newsletter_handler
|
||||||
import notification_handler
|
import notification_handler
|
||||||
import notifiers
|
import notifiers
|
||||||
import plextv
|
import plextv
|
||||||
|
@ -476,6 +477,9 @@ def start():
|
||||||
|
|
||||||
analytics_event(category='system', action='start')
|
analytics_event(category='system', action='start')
|
||||||
|
|
||||||
|
# Schedule newsletters
|
||||||
|
newsletter_handler.schedule_newsletters()
|
||||||
|
|
||||||
_STARTED = True
|
_STARTED = True
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -27,16 +27,50 @@ import newsletters
|
||||||
NEWSLETTER_SCHED = BackgroundScheduler()
|
NEWSLETTER_SCHED = BackgroundScheduler()
|
||||||
|
|
||||||
|
|
||||||
def schedule_newsletter(newsletter_id, func=None, remove_job=False, args=None, **kwargs):
|
def schedule_newsletters(newsletter_id=None):
|
||||||
if NEWSLETTER_SCHED.get_job(newsletter_id):
|
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:
|
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:
|
else:
|
||||||
NEWSLETTER_SCHED.reschedule_job(
|
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:
|
elif not remove_job:
|
||||||
NEWSLETTER_SCHED.add_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):
|
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')
|
subject_string = kwargs.pop('subject', 'Tautulli Newsletter')
|
||||||
else:
|
else:
|
||||||
# Get the subject string
|
# 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'],
|
newsletter_agent = newsletters.get_agent_class(agent_id=newsletter_config['agent_id'],
|
||||||
config=newsletter_config['config'],
|
config=newsletter_config['config'],
|
||||||
|
|
|
@ -27,6 +27,7 @@ import database
|
||||||
import helpers
|
import helpers
|
||||||
import libraries
|
import libraries
|
||||||
import logger
|
import logger
|
||||||
|
import newsletter_handler
|
||||||
import notification_handler
|
import notification_handler
|
||||||
import pmsconnect
|
import pmsconnect
|
||||||
from notification_handler import PILLOW, get_poster_info
|
from notification_handler import PILLOW, get_poster_info
|
||||||
|
@ -92,7 +93,7 @@ def get_newsletters(newsletter_id=None):
|
||||||
|
|
||||||
db = database.MonitorDatabase()
|
db = database.MonitorDatabase()
|
||||||
result = db.select('SELECT id, agent_id, agent_name, agent_label, '
|
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
|
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)
|
db.upsert(table_name='newsletters', key_dict=keys, value_dict=values)
|
||||||
logger.info(u"Tautulli Newsletters :: Updated newsletter agent: %s (newsletter_id %s)."
|
logger.info(u"Tautulli Newsletters :: Updated newsletter agent: %s (newsletter_id %s)."
|
||||||
% (agent['label'], newsletter_id))
|
% (agent['label'], newsletter_id))
|
||||||
|
newsletter_handler.schedule_newsletters(newsletter_id=newsletter_id)
|
||||||
return True
|
return True
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.warn(u"Tautulli Newsletters :: Unable to update newsletter agent: %s." % e)
|
logger.warn(u"Tautulli Newsletters :: Unable to update newsletter agent: %s." % e)
|
||||||
|
|
|
@ -1098,7 +1098,7 @@ def get_poster_info(poster_thumb='', poster_key='', poster_title='', art=False,
|
||||||
img = Image.open(poster_file)
|
img = Image.open(poster_file)
|
||||||
img = img.convert("RGBA")
|
img = img.convert("RGBA")
|
||||||
img = img.filter(ImageFilter.GaussianBlur(3)) # 3px blur
|
img = img.filter(ImageFilter.GaussianBlur(3)) # 3px blur
|
||||||
img.putalpha(102) # 40% opacity
|
img.putalpha(64) # 40% opacity
|
||||||
|
|
||||||
# Save as a png
|
# Save as a png
|
||||||
poster_file_blur = os.path.join(plexpy.CONFIG.CACHE_DIR, 'cache-image-%s.png' % thread_name)
|
poster_file_blur = os.path.join(plexpy.CONFIG.CACHE_DIR, 'cache-image-%s.png' % thread_name)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue