mirror of
https://github.com/Tautulli/Tautulli.git
synced 2025-07-07 21:51:14 -07:00
Refactor some newsletter code
This commit is contained in:
parent
28efaf73c7
commit
09ea81ccd2
5 changed files with 104 additions and 104 deletions
|
@ -522,7 +522,7 @@
|
|||
|
||||
function previewNewsletter() {
|
||||
showMsg('<i class="fa fa-check"></i> Check pop-up blocker if no response.', false, true, 2000);
|
||||
window.open('preview_newsletter?newsletter_id=' + $('#newsletter_id').val());
|
||||
window.open('newsletter?newsletter_id=' + $('#newsletter_id').val() + '&preview=true');
|
||||
}
|
||||
|
||||
function sendTestNewsletter() {
|
||||
|
|
|
@ -1,4 +1,8 @@
|
|||
<% from plexpy.notification_handler import PILLOW %>
|
||||
% if data:
|
||||
<%
|
||||
from plexpy.notification_handler import PILLOW
|
||||
recently_added = data['recently_added']
|
||||
%>
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
|
@ -615,7 +619,7 @@
|
|||
<div class="card-background" style="background-color: #3F4245;background-position: center;background-size: cover;width: 100%;height: 100%;">
|
||||
% endif
|
||||
<div class="card-poster-container" style="width: 150px;margin: 3px;border: 1px solid rgba(255,255,255,.1);float: left;position: relative;z-index: 1;height: 225px;">
|
||||
<a href="${plexpy_config['pms_web_url']}#!/server/${plexpy_config['pms_identifier']}/details?key=%2Flibrary%2Fmetadata%2F${movie['rating_key']}" title="${movie['title']}" target="_blank" style="color: #3498db;text-decoration: underline;">
|
||||
<a href="${parameters['pms_web_url']}#!/server/${parameters['pms_identifier']}/details?key=%2Flibrary%2Fmetadata%2F${movie['rating_key']}" title="${movie['title']}" target="_blank" style="color: #3498db;text-decoration: underline;">
|
||||
<div class="card-poster" style="background-image: url(${'pms_image_proxy?img=' + movie['thumb'] + '&width=300&height=450&fallback=poster&refresh=true' if preview else movie['poster_url']});background-color: #3F4245;background-position: center;background-size: cover;height: 100%;width: 100%;">
|
||||
<div class="card-poster-overlay" style="background: url(https://cdn.discordapp.com/attachments/334355557706235906/401064397780287489/newsletter-view-on-plex-flat.png) bottom right no-repeat;width: 100%;height: 100%;"></div>
|
||||
</div>
|
||||
|
@ -623,7 +627,7 @@
|
|||
</div>
|
||||
<div class="card-info-container" style="margin: 4px;width: 332px;float: left;position: relative;z-index: 1;height: 225px;">
|
||||
<div class="card-info-title nowrap" style="white-space: nowrap;border-bottom: 1px solid rgba(255, 255, 255, .1);line-height: 20px;font-size: 15px;padding: 5px;text-overflow: ellipsis;overflow: hidden;">
|
||||
<a href="${plexpy_config['pms_web_url']}#!/server/${plexpy_config['pms_identifier']}/details?key=%2Flibrary%2Fmetadata%2F${movie['rating_key']}" title="${movie['title']}" target="_blank" style="color: #ffffff;text-decoration: none;">${movie['title']}</a>
|
||||
<a href="${parameters['pms_web_url']}#!/server/${parameters['pms_identifier']}/details?key=%2Flibrary%2Fmetadata%2F${movie['rating_key']}" title="${movie['title']}" target="_blank" style="color: #ffffff;text-decoration: none;">${movie['title']}</a>
|
||||
</div>
|
||||
<div class="card-info-body" style="padding: 5px;text-overflow: ellipsis;overflow: hidden;min-height: 157px;">
|
||||
% if movie['tagline']:
|
||||
|
@ -703,7 +707,7 @@
|
|||
<div class="card-background" style="background-color: #3F4245;background-position: center;background-size: cover;width: 100%;height: 100%;">
|
||||
% endif
|
||||
<div class="card-poster-container" style="width: 150px;margin: 3px;border: 1px solid rgba(255,255,255,.1);float: left;position: relative;z-index: 1;height: 225px;">
|
||||
<a href="${plexpy_config['pms_web_url']}#!/server/${plexpy_config['pms_identifier']}/details?key=%2Flibrary%2Fmetadata%2F${link_rating_key}" title="${link_title}" target="_blank" style="color: #3498db;text-decoration: underline;">
|
||||
<a href="${parameters['pms_web_url']}#!/server/${parameters['pms_identifier']}/details?key=%2Flibrary%2Fmetadata%2F${link_rating_key}" title="${link_title}" target="_blank" style="color: #3498db;text-decoration: underline;">
|
||||
<div class="card-poster" style="background-image: url(${'pms_image_proxy?img=' + show['thumb'] + '&width=300&height=450&fallback=poster&refresh=true' if preview else show['poster_url']});background-color: #3F4245;background-position: center;background-size: cover;height: 100%;width: 100%;">
|
||||
<div class="card-poster-overlay" style="background: url(https://cdn.discordapp.com/attachments/334355557706235906/401064397780287489/newsletter-view-on-plex-flat.png) bottom right no-repeat;width: 100%;height: 100%;"></div>
|
||||
</div>
|
||||
|
@ -711,7 +715,7 @@
|
|||
</div>
|
||||
<div class="card-info-container" style="margin: 4px;width: 332px;float: left;position: relative;z-index: 1;height: 225px;">
|
||||
<div class="card-info-title nowrap" style="white-space: nowrap;border-bottom: 1px solid rgba(255, 255, 255, .1);line-height: 20px;font-size: 15px;padding: 5px;text-overflow: ellipsis;overflow: hidden;">
|
||||
<a href="${plexpy_config['pms_web_url']}#!/server/${plexpy_config['pms_identifier']}/details?key=%2Flibrary%2Fmetadata%2F${link_rating_key}" title="${link_title}" target="_blank" style="color: #ffffff;text-decoration: none;">${show['title']}</a>
|
||||
<a href="${parameters['pms_web_url']}#!/server/${parameters['pms_identifier']}/details?key=%2Flibrary%2Fmetadata%2F${link_rating_key}" title="${link_title}" target="_blank" style="color: #ffffff;text-decoration: none;">${show['title']}</a>
|
||||
</div>
|
||||
<div class="card-info-body" style="padding: 5px;text-overflow: ellipsis;overflow: hidden;min-height: 157px;">
|
||||
<div class="nowrap mb5" style="margin-bottom: 5px;white-space: nowrap;color: #ffffff;font-size: 12px;text-overflow: ellipsis;overflow: hidden;">
|
||||
|
@ -813,7 +817,7 @@
|
|||
<div class="card-background" style="background-color: #3F4245;background-position: center;background-size: cover;width: 100%;height: 100%;">
|
||||
% endif
|
||||
<div class="card-poster-container" style="width: 150px;margin: 3px;border: 1px solid rgba(255,255,255,.1);float: left;position: relative;z-index: 1;height: 150px;">
|
||||
<a href="${plexpy_config['pms_web_url']}#!/server/${plexpy_config['pms_identifier']}/details?key=%2Flibrary%2Fmetadata%2F${album['rating_key']}" title="${album['title']}" target="_blank" style="color: #3498db;text-decoration: underline;">
|
||||
<a href="${parameters['pms_web_url']}#!/server/${parameters['pms_identifier']}/details?key=%2Flibrary%2Fmetadata%2F${album['rating_key']}" title="${album['title']}" target="_blank" style="color: #3498db;text-decoration: underline;">
|
||||
<div class="card-poster" style="background-image: url(${'pms_image_proxy?img=' + album['thumb'] + '&width=300&height=450&fallback=poster&refresh=true' if preview else album['poster_url']});background-color: #3F4245;background-position: center;background-size: cover;height: 100%;width: 100%;">
|
||||
<div class="card-poster-overlay" style="background: url(https://cdn.discordapp.com/attachments/334355557706235906/401064397780287489/newsletter-view-on-plex-flat.png) bottom right no-repeat;width: 100%;height: 100%;"></div>
|
||||
</div>
|
||||
|
@ -821,7 +825,7 @@
|
|||
</div>
|
||||
<div class="card-info-container" style="margin: 4px;width: 332px;float: left;position: relative;z-index: 1;height: 150px;">
|
||||
<div class="card-info-title nowrap" style="white-space: nowrap;border-bottom: 1px solid rgba(255, 255, 255, .1);line-height: 20px;font-size: 15px;padding: 5px;text-overflow: ellipsis;overflow: hidden;">
|
||||
<a href="${plexpy_config['pms_web_url']}#!/server/${plexpy_config['pms_identifier']}/details?key=%2Flibrary%2Fmetadata%2F${album['rating_key']}" title="${album['title']}" target="_blank" style="color: #ffffff;text-decoration: none;">${album['title']}</a>
|
||||
<a href="${parameters['pms_web_url']}#!/server/${parameters['pms_identifier']}/details?key=%2Flibrary%2Fmetadata%2F${album['rating_key']}" title="${album['title']}" target="_blank" style="color: #ffffff;text-decoration: none;">${album['title']}</a>
|
||||
</div>
|
||||
<div class="card-info-body" style="padding: 5px;text-overflow: ellipsis;overflow: hidden;min-height: 82px;">
|
||||
<div class="nowrap mb5" style="margin-bottom: 5px;white-space: nowrap;color: #ffffff;font-size: 12px;text-overflow: ellipsis;overflow: hidden;">
|
||||
|
@ -883,3 +887,4 @@
|
|||
</table>
|
||||
</body>
|
||||
</html>
|
||||
% endif
|
|
@ -1,4 +1,8 @@
|
|||
<% from plexpy.notification_handler import PILLOW %>
|
||||
% if data:
|
||||
<%
|
||||
from plexpy.notification_handler import PILLOW
|
||||
recently_added = data['recently_added']
|
||||
%>
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
|
@ -615,7 +619,7 @@
|
|||
<div class="card-background">
|
||||
% endif
|
||||
<div class="card-poster-container">
|
||||
<a href="${plexpy_config['pms_web_url']}#!/server/${plexpy_config['pms_identifier']}/details?key=%2Flibrary%2Fmetadata%2F${movie['rating_key']}" title="${movie['title']}" target="_blank">
|
||||
<a href="${parameters['pms_web_url']}#!/server/${parameters['pms_identifier']}/details?key=%2Flibrary%2Fmetadata%2F${movie['rating_key']}" title="${movie['title']}" target="_blank">
|
||||
<div class="card-poster" style="background-image: url(${'pms_image_proxy?img=' + movie['thumb'] + '&width=300&height=450&fallback=poster&refresh=true' if preview else movie['poster_url']})">
|
||||
<div class="card-poster-overlay"></div>
|
||||
</div>
|
||||
|
@ -623,7 +627,7 @@
|
|||
</div>
|
||||
<div class="card-info-container">
|
||||
<div class="card-info-title nowrap">
|
||||
<a href="${plexpy_config['pms_web_url']}#!/server/${plexpy_config['pms_identifier']}/details?key=%2Flibrary%2Fmetadata%2F${movie['rating_key']}" title="${movie['title']}" target="_blank">${movie['title']}</a>
|
||||
<a href="${parameters['pms_web_url']}#!/server/${parameters['pms_identifier']}/details?key=%2Flibrary%2Fmetadata%2F${movie['rating_key']}" title="${movie['title']}" target="_blank">${movie['title']}</a>
|
||||
</div>
|
||||
<div class="card-info-body">
|
||||
% if movie['tagline']:
|
||||
|
@ -703,7 +707,7 @@
|
|||
<div class="card-background">
|
||||
% endif
|
||||
<div class="card-poster-container">
|
||||
<a href="${plexpy_config['pms_web_url']}#!/server/${plexpy_config['pms_identifier']}/details?key=%2Flibrary%2Fmetadata%2F${link_rating_key}" title="${link_title}" target="_blank">
|
||||
<a href="${parameters['pms_web_url']}#!/server/${parameters['pms_identifier']}/details?key=%2Flibrary%2Fmetadata%2F${link_rating_key}" title="${link_title}" target="_blank">
|
||||
<div class="card-poster" style="background-image: url(${'pms_image_proxy?img=' + show['thumb'] + '&width=300&height=450&fallback=poster&refresh=true' if preview else show['poster_url']});">
|
||||
<div class="card-poster-overlay"></div>
|
||||
</div>
|
||||
|
@ -711,7 +715,7 @@
|
|||
</div>
|
||||
<div class="card-info-container">
|
||||
<div class="card-info-title nowrap">
|
||||
<a href="${plexpy_config['pms_web_url']}#!/server/${plexpy_config['pms_identifier']}/details?key=%2Flibrary%2Fmetadata%2F${link_rating_key}" title="${link_title}" target="_blank">${show['title']}</a>
|
||||
<a href="${parameters['pms_web_url']}#!/server/${parameters['pms_identifier']}/details?key=%2Flibrary%2Fmetadata%2F${link_rating_key}" title="${link_title}" target="_blank">${show['title']}</a>
|
||||
</div>
|
||||
<div class="card-info-body">
|
||||
<div class="nowrap mb5">
|
||||
|
@ -813,7 +817,7 @@
|
|||
<div class="card-background">
|
||||
% endif
|
||||
<div class="card-poster-container">
|
||||
<a href="${plexpy_config['pms_web_url']}#!/server/${plexpy_config['pms_identifier']}/details?key=%2Flibrary%2Fmetadata%2F${album['rating_key']}" title="${album['title']}" target="_blank">
|
||||
<a href="${parameters['pms_web_url']}#!/server/${parameters['pms_identifier']}/details?key=%2Flibrary%2Fmetadata%2F${album['rating_key']}" title="${album['title']}" target="_blank">
|
||||
<div class="card-poster" style="background-image: url(${'pms_image_proxy?img=' + album['thumb'] + '&width=300&height=450&fallback=poster&refresh=true' if preview else album['poster_url']});">
|
||||
<div class="card-poster-overlay"></div>
|
||||
</div>
|
||||
|
@ -821,7 +825,7 @@
|
|||
</div>
|
||||
<div class="card-info-container">
|
||||
<div class="card-info-title nowrap">
|
||||
<a href="${plexpy_config['pms_web_url']}#!/server/${plexpy_config['pms_identifier']}/details?key=%2Flibrary%2Fmetadata%2F${album['rating_key']}" title="${album['title']}" target="_blank">${album['title']}</a>
|
||||
<a href="${parameters['pms_web_url']}#!/server/${parameters['pms_identifier']}/details?key=%2Flibrary%2Fmetadata%2F${album['rating_key']}" title="${album['title']}" target="_blank">${album['title']}</a>
|
||||
</div>
|
||||
<div class="card-info-body">
|
||||
<div class="nowrap mb5">
|
||||
|
@ -883,3 +887,4 @@
|
|||
</table>
|
||||
</body>
|
||||
</html>
|
||||
% endif
|
|
@ -236,7 +236,8 @@ def send_newsletter(newsletter_id=None, subject=None, notify_action='', newslett
|
|||
email_config=newsletter_config['email_config'])
|
||||
return agent.send(subject=subject,
|
||||
action=notify_action.split('on_')[-1],
|
||||
newsletter_log_id=newsletter_log_id, **kwargs)
|
||||
newsletter_log_id=newsletter_log_id,
|
||||
**kwargs)
|
||||
else:
|
||||
logger.debug(u"Tautulli Newsletters :: Notification requested but no newsletter_id received.")
|
||||
|
||||
|
@ -270,7 +271,8 @@ class Newsletter(object):
|
|||
|
||||
self.parameters = {'server_name': plexpy.CONFIG.PMS_NAME}
|
||||
self.is_preview = False
|
||||
self.master_template = False
|
||||
|
||||
self.data = {}
|
||||
|
||||
def set_config(self, config=None, default=None):
|
||||
return self._validate_config(config=config, default=default)
|
||||
|
@ -288,19 +290,62 @@ class Newsletter(object):
|
|||
|
||||
return new_config
|
||||
|
||||
def _render_template(self, **kwargs):
|
||||
if self.master_template:
|
||||
def retrieve_data(self):
|
||||
pass
|
||||
|
||||
def _has_data(self):
|
||||
return False
|
||||
|
||||
def raw_data(self, preview=False):
|
||||
if preview:
|
||||
self.is_preview = True
|
||||
|
||||
self.retrieve_data()
|
||||
return {'title': self.NAME,
|
||||
'parameters': self.parameters,
|
||||
'data': self.data}
|
||||
|
||||
def generate_newsletter(self, preview=False, master=False):
|
||||
if preview:
|
||||
self.is_preview = True
|
||||
|
||||
if master:
|
||||
template = self._TEMPLATE_MASTER
|
||||
else:
|
||||
template = self._TEMPLATE
|
||||
|
||||
self.retrieve_data()
|
||||
|
||||
return serve_template(
|
||||
templatename=template,
|
||||
title=self.NAME,
|
||||
parameters=self.parameters,
|
||||
**kwargs
|
||||
data=self.data,
|
||||
preview=self.is_preview
|
||||
)
|
||||
|
||||
def send(self, subject='', **kwargs):
|
||||
subject = self.format_subject(subject or self.email_config['subject'])
|
||||
newsletter = self.generate_newsletter()
|
||||
|
||||
if not self._has_data():
|
||||
logger.warn(u"Tautulli Newsletters :: %s newsletter has no data. Newsletter not sent." % self.NAME)
|
||||
return False
|
||||
|
||||
if self.email_config['notifier']:
|
||||
return send_notification(
|
||||
notifier_id=self.email_config['notifier'],
|
||||
subject=subject,
|
||||
body=newsletter
|
||||
)
|
||||
|
||||
else:
|
||||
email = EMAIL(config=self.email_config)
|
||||
return email.notify(
|
||||
subject=subject,
|
||||
body=newsletter
|
||||
)
|
||||
|
||||
def format_subject(self, subject):
|
||||
subject = subject or self._DEFAULT_EMAIL_CONFIG['subject']
|
||||
|
||||
|
@ -317,39 +362,6 @@ class Newsletter(object):
|
|||
|
||||
return subject
|
||||
|
||||
def retrieve_data(self):
|
||||
pass
|
||||
|
||||
def generate_newsletter(self):
|
||||
pass
|
||||
|
||||
def preview(self, master=False):
|
||||
self.is_preview = True
|
||||
if master:
|
||||
self.master_template = True
|
||||
self.retrieve_data()
|
||||
return self.generate_newsletter()
|
||||
|
||||
def send(self, subject='', **kwargs):
|
||||
self.retrieve_data()
|
||||
|
||||
subject = self.format_subject(subject or self.email_config['subject'])
|
||||
newsletter = self.generate_newsletter()
|
||||
|
||||
if self.email_config['notifier']:
|
||||
return send_notification(
|
||||
notifier_id=self.email_config['notifier'],
|
||||
subject=subject,
|
||||
body=newsletter
|
||||
)
|
||||
|
||||
else:
|
||||
email = EMAIL(config=self.email_config)
|
||||
return email.notify(
|
||||
subject=subject,
|
||||
body=newsletter
|
||||
)
|
||||
|
||||
def return_config_options(self):
|
||||
config_options = []
|
||||
return config_options
|
||||
|
@ -388,13 +400,8 @@ class RecentlyAdded(Newsletter):
|
|||
|
||||
self.parameters['start_date'] = self.start_date
|
||||
self.parameters['end_date'] = self.end_date
|
||||
|
||||
self.plexpy_config = {
|
||||
'pms_identifier': plexpy.CONFIG.PMS_IDENTIFIER,
|
||||
'pms_web_url': plexpy.CONFIG.PMS_WEB_URL
|
||||
}
|
||||
|
||||
self.recently_added = {}
|
||||
self.parameters['pms_identifier'] = plexpy.CONFIG.PMS_IDENTIFIER
|
||||
self.parameters['pms_web_url'] = plexpy.CONFIG.PMS_WEB_URL
|
||||
|
||||
def _get_recently_added(self, media_type=None):
|
||||
pms_connect = pmsconnect.PmsConnect()
|
||||
|
@ -516,15 +523,16 @@ class RecentlyAdded(Newsletter):
|
|||
media_types = {s['section_type'] for s in self._get_sections()
|
||||
if str(s['section_id']) in self.config['incl_libraries']}
|
||||
|
||||
recently_added = {}
|
||||
for media_type in media_types:
|
||||
if media_type not in self.recently_added:
|
||||
self.recently_added[media_type] = self._get_recently_added(media_type)
|
||||
if media_type not in recently_added:
|
||||
recently_added[media_type] = self._get_recently_added(media_type)
|
||||
|
||||
if not self.is_preview:
|
||||
# Upload posters and art to Imgur
|
||||
movies = self.recently_added.get('movie', [])
|
||||
shows = self.recently_added.get('show', [])
|
||||
artists = self.recently_added.get('artist', [])
|
||||
movies = recently_added.get('movie', [])
|
||||
shows = recently_added.get('show', [])
|
||||
artists = recently_added.get('artist', [])
|
||||
albums = [a for artist in artists for a in artist['album']]
|
||||
|
||||
for item in movies + shows + albums:
|
||||
|
@ -545,14 +553,19 @@ class RecentlyAdded(Newsletter):
|
|||
blur=True)
|
||||
item['art_url'] = art_info.get('blur_art_url', '')
|
||||
|
||||
return self.recently_added
|
||||
self.data['recently_added'] = recently_added
|
||||
|
||||
def generate_newsletter(self):
|
||||
return self._render_template(
|
||||
recently_added=self.recently_added,
|
||||
plexpy_config=self.plexpy_config,
|
||||
preview=self.is_preview
|
||||
)
|
||||
return self.data
|
||||
|
||||
def _has_data(self):
|
||||
recently_added = self.data.get('recently_added')
|
||||
if recently_added and \
|
||||
recently_added.get('movie') or \
|
||||
recently_added.get('show') or \
|
||||
recently_added.get('artist'):
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
def _get_sections(self):
|
||||
return libraries.Libraries().get_sections()
|
||||
|
|
|
@ -5288,34 +5288,6 @@ class WebInterface(object):
|
|||
def get_plexpy_url(self, **kwargs):
|
||||
return helpers.get_plexpy_url()
|
||||
|
||||
@cherrypy.expose
|
||||
@requireAuth()
|
||||
def newsletter(self, **kwargs):
|
||||
news_letter = newsletters.Newsletter()
|
||||
|
||||
config = {
|
||||
"pms_identifier": plexpy.CONFIG.PMS_IDENTIFIER,
|
||||
"pms_web_url": plexpy.CONFIG.PMS_WEB_URL
|
||||
}
|
||||
|
||||
return serve_template(templatename="newsletter_template.html",
|
||||
title="Newsletter",
|
||||
recently_added=news_letter.recently_added,
|
||||
start_date=news_letter.start_date,
|
||||
end_date=news_letter.end_date,
|
||||
config=config)
|
||||
|
||||
@cherrypy.expose
|
||||
@cherrypy.tools.json_out()
|
||||
@requireAuth()
|
||||
def newsletter_raw(self, **kwargs):
|
||||
news_letter = newsletters.Newsletter()
|
||||
|
||||
if news_letter.recently_added:
|
||||
return news_letter.recently_added
|
||||
else:
|
||||
return None
|
||||
|
||||
@cherrypy.expose
|
||||
@cherrypy.tools.json_out()
|
||||
@requireAuth(member_of("admin"))
|
||||
|
@ -5518,13 +5490,18 @@ class WebInterface(object):
|
|||
|
||||
@cherrypy.expose
|
||||
@requireAuth(member_of("admin"))
|
||||
def preview_newsletter(self, newsletter_id=None, master=False, **kwargs):
|
||||
def newsletter(self, newsletter_id=None, preview=False, master=False, raw=False, **kwargs):
|
||||
if newsletter_id:
|
||||
newsletter = newsletters.get_newsletter_config(newsletter_id=newsletter_id)
|
||||
newsletter_agent = newsletters.get_agent_class(agent_id=newsletter['agent_id'], config=newsletter['config'])
|
||||
|
||||
if newsletter_agent:
|
||||
return newsletter_agent.preview(master=master)
|
||||
preview = (preview == 'true')
|
||||
|
||||
if raw:
|
||||
return json.dumps(newsletter_agent.raw_data(preview=preview))
|
||||
|
||||
return newsletter_agent.generate_newsletter(preview=preview, master=master)
|
||||
|
||||
return "Invalid newsletter id %s" % newsletter_id
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue