diff --git a/data/interfaces/default/newsletter_config.html b/data/interfaces/default/newsletter_config.html index a08bc130..8ddf90b1 100644 --- a/data/interfaces/default/newsletter_config.html +++ b/data/interfaces/default/newsletter_config.html @@ -133,7 +133,7 @@
+
+ +

+ Optional: Enter a subject line for the email. Leave blank for default. +
+ Note: You may include {start_date} and {end_date} as parameters. The global date format under Settings > General will be used. +

+ -
+
% for item in newsletter['email_config_options']: % if item['input_type'] == 'help':
diff --git a/data/interfaces/newsletters/recently_added.html b/data/interfaces/newsletters/recently_added.html index b37255cc..d5bf8033 100644 --- a/data/interfaces/newsletters/recently_added.html +++ b/data/interfaces/newsletters/recently_added.html @@ -733,7 +733,7 @@
-
${start_date} - ${end_date}
+
${parameters['start_date']} - ${parameters['end_date']}
% if recently_added.get('movie'): diff --git a/plexpy/__init__.py b/plexpy/__init__.py index a8aaa743..70b82480 100644 --- a/plexpy/__init__.py +++ b/plexpy/__init__.py @@ -624,7 +624,7 @@ def dbcheck(): c_db.execute( 'CREATE TABLE IF NOT EXISTS newsletters (id INTEGER PRIMARY KEY AUTOINCREMENT, ' 'agent_id INTEGER, agent_name TEXT, agent_label TEXT, ' - 'friendly_name TEXT, newsletter_config TEXT, email_config TEXT, email_notifier INTEGER DEFAULT 0, ' + 'friendly_name TEXT, newsletter_config TEXT, email_config TEXT, ' 'cron TEXT NOT NULL DEFAULT "0 0 * * 0", active INTEGER DEFAULT 0)' ) diff --git a/plexpy/newsletters.py b/plexpy/newsletters.py index 1de6e40f..36dea396 100644 --- a/plexpy/newsletters.py +++ b/plexpy/newsletters.py @@ -15,14 +15,10 @@ import arrow import json -from email.mime.multipart import MIMEMultipart -from email.mime.text import MIMEText -import email.utils from itertools import groupby from mako.lookup import TemplateLookup from mako import exceptions import os -import re import time import plexpy @@ -32,8 +28,7 @@ import libraries import logger import notification_handler import pmsconnect -import request -from notifiers import EMAIL +from notifiers import send_notification, EMAIL AGENT_IDS = { @@ -114,8 +109,8 @@ def get_newsletter_config(newsletter_id=None): return None try: - config = json.loads(result.pop('newsletter_config') or '{}') - email_config = json.loads(result.pop('email_config') or '{}') + config = json.loads(result.pop('newsletter_config', '{}')) + email_config = json.loads(result.pop('email_config', '{}')) newsletter_agent = get_agent_class(agent_id=result['agent_id'], config=config, email_config=email_config) newsletter_config = newsletter_agent.return_config_options() newsletter_email_config = newsletter_agent.return_email_config_options() @@ -124,6 +119,7 @@ def get_newsletter_config(newsletter_id=None): return result['config'] = config + result['email_config'] = email_config result['config_options'] = newsletter_config result['email_config_options'] = newsletter_email_config @@ -188,8 +184,6 @@ def set_newsletter_config(newsletter_id=None, agent_id=None, **kwargs): newsletter_config = {k[len(config_prefix):]: kwargs.pop(k) for k in kwargs.keys() if k.startswith(config_prefix)} - - email_notifier = kwargs.pop('email_notifier', 0) email_config = {k[len(email_config_prefix):]: kwargs.pop(k) for k in kwargs.keys() if k.startswith(email_config_prefix)} @@ -202,7 +196,6 @@ def set_newsletter_config(newsletter_id=None, agent_id=None, **kwargs): 'friendly_name': kwargs.get('friendly_name', ''), 'newsletter_config': json.dumps(agent_class.config), 'email_config': json.dumps(agent_class.email_config), - 'email_notifier': email_notifier, 'cron': kwargs.get('cron'), 'active': kwargs.get('active') } @@ -245,11 +238,17 @@ def serve_template(templatename, **kwargs): class Newsletter(object): NAME = '' _DEFAULT_CONFIG = {} - _DEFAULT_EMAIL_CONFIG = EMAIL._DEFAULT_CONFIG def __init__(self, config=None, email_config=None): + self._default_email_config = EMAIL().return_default_config() + self._default_email_config['from_name'] = 'Tautulli Newsletter' + self._default_email_config['notifier'] = 0 + self._default_email_config['subject'] = 'Tautulli Newsletter' + self.config = self.set_config(config=config, default=self._DEFAULT_CONFIG) - self.email_config = self.set_config(config=email_config, default=self._DEFAULT_EMAIL_CONFIG) + self.email_config = self.set_config(config=email_config, default=self._default_email_config) + + self.parameters = {} def set_config(self, config=None, default=None): return self._validate_config(config=config, default=default) @@ -267,33 +266,59 @@ class Newsletter(object): return new_config - def preview(self, **kwargs): + def _render_template(self, **kwargs): + return serve_template( + templatename=self._TEMPLATE, + title=self.NAME, + parameters=self.parameters, + **kwargs + ) + + def _format_subject(self, subject): + subject = subject or self._default_email_config['subject'] + + try: + subject = unicode(subject).format(**self.parameters) + except LookupError as e: + logger.error( + u"Tautulli Newsletter :: Unable to parse parameter %s in newsletter subject. Using fallback." % e) + subject = unicode(self._default_email_config['subject']).format(**self.parameters) + except Exception as e: + logger.error( + u"Tautulli Newsletter :: Unable to parse custom newsletter subject: %s. Using fallback." % e) + subject = unicode(self._default_email_config['subject']).format(**self.parameters) + + return subject + + def retrieve_data(self): pass + def generate_newsletter(self): + pass + + def preview(self): + self.retrieve_data() + return self.generate_newsletter() + def send(self, **kwargs): - pass + self.retrieve_data() - def make_request(self, url, method='POST', **kwargs): - response, err_msg, req_msg = request.request_response2(url, method, **kwargs) + subject = self._format_subject(self.email_config['subject']) + newsletter = self.generate_newsletter() - if response and not err_msg: - logger.info(u"Tautulli Newsletters :: {name} notification sent.".format(name=self.NAME)) - return True + if self.email_config['notifier']: + return send_notification( + notifier_id=self.email_config['notifier'], + subject=subject, + body=newsletter + ) else: - verify_msg = "" - if response is not None and response.status_code >= 400 and response.status_code < 500: - verify_msg = " Verify you notification newsletter agent settings are correct." - - logger.error(u"Tautulli Newsletters :: {name} notification failed.{}".format(verify_msg, name=self.NAME)) - - if err_msg: - logger.error(u"Tautulli Newsletters :: {}".format(err_msg)) - - if req_msg: - logger.debug(u"Tautulli Newsletters :: Request response: {}".format(req_msg)) - - return False + email = EMAIL(config=self.email_config) + return email.notify( + subject=subject, + body=newsletter + ) def return_config_options(self): config_options = [] @@ -321,6 +346,8 @@ class RecentlyAdded(Newsletter): elif not isinstance(self.config['incl_libraries'], list): self.config['incl_libraries'] = [self.config['incl_libraries']] + self._default_email_config['subject'] = 'Recently Added to Plex! ({end_date})' + date_format = helpers.momentjs_to_arrow(plexpy.CONFIG.DATE_FORMAT) self.end_time = int(time.time()) @@ -328,6 +355,9 @@ class RecentlyAdded(Newsletter): self.end_date = arrow.get(self.end_time).format(date_format) self.start_date = arrow.get(self.start_time).format(date_format) + self.parameters = {'start_date': self.start_date, + 'end_date': self.end_date} + self.plexpy_config = { 'pms_identifier': plexpy.CONFIG.PMS_IDENTIFIER, 'pms_web_url': plexpy.CONFIG.PMS_WEB_URL @@ -451,32 +481,22 @@ class RecentlyAdded(Newsletter): return recently_added - def get_recently_added(self): + def retrieve_data(self): media_types = {s['section_type'] for s in self._get_sections() if str(s['section_id']) in self.config['incl_libraries']} for media_type in media_types: - self.recently_added[media_type] = self._get_recently_added(media_type) + if media_type not in self.recently_added: + self.recently_added[media_type] = self._get_recently_added(media_type) return self.recently_added - def preview(self, **kwargs): - self.get_recently_added() - - return serve_template( - templatename=self._TEMPLATE, - title=self.NAME, + def generate_newsletter(self): + return self._render_template( recently_added=self.recently_added, - start_date=self.start_date, - end_date=self.end_date, plexpy_config=self.plexpy_config ) - def send(self, **kwargs): - self.get_recently_added() - - return - def _get_sections(self): return libraries.Libraries().get_sections() diff --git a/plexpy/notifiers.py b/plexpy/notifiers.py index 31a59a6b..7c1f38a6 100644 --- a/plexpy/notifiers.py +++ b/plexpy/notifiers.py @@ -454,7 +454,7 @@ def get_notifier_config(notifier_id=None): return None try: - config = json.loads(result.pop('notifier_config') or '{}') + config = json.loads(result.pop('notifier_config', '{}')) notifier_agent = get_agent_class(agent_id=result['agent_id'], config=config) notifier_config = notifier_agent.return_config_options() except Exception as e: @@ -772,6 +772,9 @@ class Notifier(object): return new_config + def return_default_config(self): + return self._DEFAULT_CONFIG + def notify(self, subject='', body='', action='', **kwargs): if self.NAME != 'Script': if not subject and self.config.get('incl_subject', True): @@ -1271,7 +1274,7 @@ class EMAIL(Notifier): Email notifications """ NAME = 'Email' - _DEFAULT_CONFIG = {'from_name': '', + _DEFAULT_CONFIG = {'from_name': 'Tautulli', 'from': '', 'to': '', 'cc': '', diff --git a/plexpy/webserve.py b/plexpy/webserve.py index 549429dc..00e1b7ca 100644 --- a/plexpy/webserve.py +++ b/plexpy/webserve.py @@ -3155,9 +3155,9 @@ class WebInterface(object): if notifier_id: notifier = notifiers.get_notifier_config(notifier_id=notifier_id) - + if notifier: - logger.debug(u"Sending %s%s notification." % (test, notifier['agent_name'])) + logger.debug(u"Sending %s%s notification." % (test, notifier['agent_label'])) if notification_handler.notify(notifier_id=notifier_id, notify_action=notify_action, subject=subject, @@ -5500,9 +5500,8 @@ class WebInterface(object): newsletter = newsletters.get_newsletter_config(newsletter_id=newsletter_id) if newsletter: - logger.debug(u"Sending %s%s newsletter." % (test, newsletter['agent_name'])) - if newsletter_handler.send(newsletter_id=newsletter_id, - **kwargs): + logger.debug(u"Sending %s%s newsletter." % (test, newsletter['agent_label'])) + if newsletters.send_newsletter(newsletter_id=newsletter_id): return "Newsletter sent." else: return "Newsletter failed."