diff --git a/plexpy/config.py b/plexpy/config.py
index 5c5ade78..7734c97a 100644
--- a/plexpy/config.py
+++ b/plexpy/config.py
@@ -215,6 +215,8 @@ _CONFIG_DEFINITIONS = {
'HIPCHAT_URL': (str, 'Hipchat', ''),
'HIPCHAT_COLOR': (str, 'Hipchat', ''),
'HIPCHAT_INCL_SUBJECT': (int, 'Hipchat', 1),
+ 'HIPCHAT_INCL_PMSLINK': (int, 'Hipchat', 0),
+ 'HIPCHAT_INCL_POSTER': (int, 'Hipchat', 0),
'HIPCHAT_EMOTICON': (str, 'Hipchat', ''),
'HIPCHAT_ENABLED': (int, 'Hipchat', 0),
'HIPCHAT_ON_PLAY': (int, 'Hipchat', 0),
diff --git a/plexpy/notifiers.py b/plexpy/notifiers.py
index cfe86502..98d9c67d 100644
--- a/plexpy/notifiers.py
+++ b/plexpy/notifiers.py
@@ -1,4 +1,4 @@
-# This file is part of PlexPy.
+# This file is part of PlexPy.
#
# PlexPy is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -31,6 +31,7 @@ import urllib
from urllib import urlencode
import urllib2
from urlparse import urlparse
+import uuid
import gntp.notifier
import facebook
@@ -609,12 +610,78 @@ def send_notification(agent_id, subject, body, notify_action, **kwargs):
return join.notify(message=body, subject=subject)
elif agent_id == 19:
hipchat = HIPCHAT()
- return hipchat.notify(message=body, subject=subject)
+ return hipchat.notify(message=body, subject=subject, **kwargs)
else:
logger.debug(u"PlexPy Notifiers :: Unknown agent id received.")
else:
logger.debug(u"PlexPy Notifiers :: Notification requested but no agent id received.")
+class PrettyMetadata(object):
+ def __init__(self, metadata):
+ self.metadata = metadata
+ self.media_type = metadata['media_type']
+
+ def get_poster_url(self):
+ self.poster_url = self.metadata.get('poster_url','')
+ if not self.poster_url:
+ if self.metadata['media_type'] in ['artist', 'track']:
+ self.poster_url = 'https://raw.githubusercontent.com/drzoidberg33/plexpy/master/data/interfaces/default/images/cover.png'
+ else:
+ self.poster_url = 'https://raw.githubusercontent.com/drzoidberg33/plexpy/master/data/interfaces/default/images/poster.png'
+ return self.poster_url
+
+ def get_poster_link(self):
+ self.poster_link = ''
+ if self.metadata.get('thetvdb_url',''):
+ self.poster_link = self.metadata.get('thetvdb_url', '')
+ elif self.metadata.get('themoviedb_url',''):
+ self.poster_link = self.metadata.get('themoviedb_url', '')
+ elif self.metadata.get('imdb_url',''):
+ self.poster_link = self.metadata.get('imdb_url', '')
+ elif self.metadata.get('lastfm_url',''):
+ self.poster_link = self.metadata.get('lastfm_url', '')
+ return self.poster_link
+
+ def get_caption(self):
+ self.caption = ''
+ if self.metadata.get('thetvdb_url',''):
+ self.caption = 'View on TheTVDB'
+ elif self.metadata.get('themoviedb_url',''):
+ self.caption = 'View on The Movie Database'
+ elif self.metadata.get('imdb_url',''):
+ self.caption = 'View on IMDB'
+ elif self.metadata.get('lastfm_url',''):
+ self.caption = 'View on Last.fm'
+ return self.caption
+
+ def get_title(self, divider = '-'):
+ self.title = None
+ if self.media_type == 'movie':
+ self.title = '%s (%s)' % (self.metadata['title'], self.metadata['year'])
+ elif self.media_type == 'show':
+ self.title = '%s (%s)' % (self.metadata['title'], self.metadata['year'])
+ elif self.media_type == 'artist':
+ self.title = self.metadata['title']
+ elif self.media_type == 'track':
+ self.title = '%s - %s' % (self.metadata['grandparent_title'], self.metadata['title'])
+ elif self.media_type == 'episode':
+ self.title = '%s - %s (S%s %s E%s)' % (self.metadata['grandparent_title'],
+ self.metadata['title'],
+ self.metadata['parent_media_index'],
+ divider,
+ self.metadata['media_index'])
+ return self.title.encode("utf-8")
+
+ def get_subtitle(self):
+ if self.media_type == 'track':
+ self.subtitle = self.metadata['parent_title']
+ else:
+ self.subtitle = self.metadata['summary']
+ return self.subtitle.encode("utf-8")
+
+ def get_plex_url(self):
+ self.plex_url = self.metadata['plex_url']
+ return self.plex_url
class GROWL(object):
"""
@@ -1919,65 +1986,19 @@ class SLACK(object):
data['icon_url'] = self.icon_emoji
if self.incl_poster and 'metadata' in kwargs:
+ # Grab formatted metadata
+ pretty_metadata = PrettyMetadata(kwargs['metadata'])
+ poster_url = pretty_metadata.get_poster_url()
+ plex_url = pretty_metadata.get_plex_url()
+ poster_link = pretty_metadata.get_poster_link()
+ caption = pretty_metadata.get_caption()
+ title = pretty_metadata.get_title()
+
+ # Build Slack post attachment
attachment = {}
- metadata = kwargs['metadata']
- poster_url = metadata.get('poster_url','')
- poster_link = ''
- caption = ''
-
- # Use default posters if no poster_url
- if not poster_url:
- if metadata['media_type'] in ['artist', 'track']:
- poster_url = 'https://raw.githubusercontent.com/drzoidberg33/plexpy/master/data/interfaces/default/images/cover.png'
- else:
- poster_url = 'https://raw.githubusercontent.com/drzoidberg33/plexpy/master/data/interfaces/default/images/poster.png'
-
- if metadata['media_type'] == 'movie':
- title = '%s (%s)' % (metadata['title'], metadata['year'])
- if metadata.get('imdb_url',''):
- poster_link = metadata.get('imdb_url', '')
- caption = 'View on IMDB'
- elif metadata.get('themoviedb_url',''):
- poster_link = metadata.get('themoviedb_url', '')
- caption = 'View on The Movie Database'
-
- elif metadata['media_type'] == 'show':
- title = '%s (%s)' % (metadata['title'], metadata['year'])
- if metadata.get('thetvdb_url',''):
- poster_link = metadata.get('thetvdb_url', '')
- caption = 'View on TheTVDB'
- elif metadata.get('themoviedb_url',''):
- poster_link = metadata.get('themoviedb_url', '')
- caption = 'View on The Movie Database'
-
- elif metadata['media_type'] == 'episode':
- title = '%s - %s (S%s - E%s)' % (metadata['grandparent_title'],
- metadata['title'],
- metadata['parent_media_index'],
- metadata['media_index'])
- if metadata.get('thetvdb_url',''):
- poster_link = metadata.get('thetvdb_url', '')
- caption = 'View on TheTVDB'
- elif metadata.get('themoviedb_url',''):
- poster_link = metadata.get('themoviedb_url', '')
- caption = 'View on The Movie Database'
-
- elif metadata['media_type'] == 'artist':
- title = metadata['title']
- if metadata.get('lastfm_url',''):
- poster_link = metadata.get('lastfm_url', '')
- caption = 'View on Last.fm'
-
- elif metadata['media_type'] == 'track':
- title = '%s - %s' % (metadata['grandparent_title'], metadata['title'])
- if metadata.get('lastfm_url',''):
- poster_link = metadata.get('lastfm_url', '')
- caption = 'View on Last.fm'
-
- # Build Facebook post attachment
if self.incl_pmslink:
caption = 'View on Plex Web'
- attachment['title_link'] = metadata['plex_url']
+ attachment['title_link'] = plex_url
attachment['text'] = caption
elif poster_link:
attachment['title_link'] = poster_link
@@ -2376,70 +2397,19 @@ class FacebookNotifier(object):
attachment = {}
if self.incl_poster and 'metadata' in kwargs:
- metadata = kwargs['metadata']
- poster_url = metadata.get('poster_url','')
- poster_link = ''
- caption = ''
-
- # Use default posters if no poster_url
- if not poster_url:
- if metadata['media_type'] in ['artist', 'track']:
- poster_url = 'https://raw.githubusercontent.com/drzoidberg33/plexpy/master/data/interfaces/default/images/cover.png'
- else:
- poster_url = 'https://raw.githubusercontent.com/drzoidberg33/plexpy/master/data/interfaces/default/images/poster.png'
-
- if metadata['media_type'] == 'movie':
- title = '%s (%s)' % (metadata['title'], metadata['year'])
- subtitle = metadata['summary']
- if metadata.get('imdb_url',''):
- poster_link = metadata.get('imdb_url', '')
- caption = 'View on IMDB'
- elif metadata.get('themoviedb_url',''):
- poster_link = metadata.get('themoviedb_url', '')
- caption = 'View on The Movie Database'
-
- elif metadata['media_type'] == 'show':
- title = '%s (%s)' % (metadata['title'], metadata['year'])
- subtitle = metadata['summary']
- if metadata.get('thetvdb_url',''):
- poster_link = metadata.get('thetvdb_url', '')
- caption = 'View on TheTVDB'
- elif metadata.get('themoviedb_url',''):
- poster_link = metadata.get('themoviedb_url', '')
- caption = 'View on The Movie Database'
-
- elif metadata['media_type'] == 'episode':
- title = '%s - %s (S%s %s E%s)' % (metadata['grandparent_title'],
- metadata['title'],
- metadata['parent_media_index'],
- '\xc2\xb7'.decode('utf8'),
- metadata['media_index'])
- subtitle = metadata['summary']
- if metadata.get('thetvdb_url',''):
- poster_link = metadata.get('thetvdb_url', '')
- caption = 'View on TheTVDB'
- elif metadata.get('themoviedb_url',''):
- poster_link = metadata.get('themoviedb_url', '')
- caption = 'View on The Movie Database'
-
- elif metadata['media_type'] == 'artist':
- title = metadata['title']
- subtitle = metadata['summary']
- if metadata.get('lastfm_url',''):
- poster_link = metadata.get('lastfm_url', '')
- caption = 'View on Last.fm'
-
- elif metadata['media_type'] == 'track':
- title = '%s - %s' % (metadata['grandparent_title'], metadata['title'])
- subtitle = metadata['parent_title']
- if metadata.get('lastfm_url',''):
- poster_link = metadata.get('lastfm_url', '')
- caption = 'View on Last.fm'
+ # Grab formatted metadata
+ pretty_metadata = PrettyMetadata(kwargs['metadata'])
+ poster_url = pretty_metadata.get_poster_url()
+ plex_url = pretty_metadata.get_plex_url()
+ poster_link = pretty_metadata.get_poster_link()
+ caption = pretty_metadata.get_caption()
+ title = pretty_metadata.get_title('\xc2\xb7'.decode('utf8'))
+ subtitle = pretty_metadata.get_subtitle()
# Build Facebook post attachment
if self.incl_pmslink:
caption = 'View on Plex Web'
- attachment['link'] = metadata['plex_url']
+ attachment['link'] = plex_url
attachment['caption'] = caption
elif poster_link:
attachment['link'] = poster_link
@@ -2754,32 +2724,77 @@ class HIPCHAT(object):
def __init__(self):
self.apiurl = plexpy.CONFIG.HIPCHAT_URL
self.color = plexpy.CONFIG.HIPCHAT_COLOR
- self.incl_subject = plexpy.CONFIG.HIPCHAT_INCL_SUBJECT
self.emoticon = plexpy.CONFIG.HIPCHAT_EMOTICON
+ self.incl_pmslink = plexpy.CONFIG.HIPCHAT_INCL_PMSLINK
+ self.incl_poster = plexpy.CONFIG.HIPCHAT_INCL_POSTER
+ self.incl_subject = plexpy.CONFIG.HIPCHAT_INCL_SUBJECT
- def notify(self, message, subject):
+ def notify(self, message, subject, **kwargs):
if not message or not subject:
return
-
+
+ data = {'notify': 'false'}
+
+ text = message.encode('utf-8')
+
if self.incl_subject:
- text = subject.encode('utf-8') + ': ' + message.encode('utf-8')
- else:
- text = message.encode('utf-8')
-
- if self.emoticon:
- text = self.emoticon + ' ' + text
-
- data = {'message': text,
- 'notify': 'false',
- 'message_format': 'text'}
+ data['from'] = subject.encode('utf-8')
if self.color:
data['color'] = self.color
+ if self.incl_poster and 'metadata' in kwargs:
+ pretty_metadata = PrettyMetadata(kwargs['metadata'])
+ poster_url = pretty_metadata.get_poster_url()
+ poster_link = pretty_metadata.get_poster_link()
+ caption = pretty_metadata.get_caption()
+ title = pretty_metadata.get_title()
+ subtitle = pretty_metadata.get_subtitle()
+ plex_url = pretty_metadata.get_plex_url()
+
+ card = {'title': title,
+ 'format': 'medium',
+ 'style': 'application',
+ 'id': uuid.uuid4().hex}
+ description = {'format': 'text',
+ 'value': subtitle}
+ card['description'] = description
+ thumbnail = {'url': poster_url}
+ card['thumbnail'] = thumbnail
+ attributes = []
+
+ if self.incl_pmslink:
+ pms_values = {'label': 'View on Plex Web',
+ 'url': plex_url}
+ plex_web = {'value': pms_values}
+ attributes.append(plex_web)
+
+ if poster_link:
+ card['url'] = poster_link
+ info_values = {'label': caption,
+ 'url': poster_link}
+ content_info_web = {'value': info_values}
+ attributes.append(content_info_web)
+
+ if len(attributes):
+ card['attributes'] = attributes
+
+ act_icon = {'url': poster_url}
+ activity = {'html': text,
+ 'icon': act_icon}
+ card['activity'] = activity
+
+ data['message'] = text
+ data['card'] = card
+
+ else:
+ if self.emoticon:
+ text = self.emoticon + ' ' + text
+ data['message'] = text
+ data['message_format'] = 'text'
+
hiphost = urlparse(self.apiurl).hostname
- hippath = urlparse(self.apiurl).path
- hipquery = urlparse(self.apiurl).query
- hipfullq = hippath + '?' + hipquery
+ hipfullq = urlparse(self.apiurl).path + '?' + urlparse(self.apiurl).query
http_handler = HTTPSConnection(hiphost)
http_handler.request("POST",
@@ -2834,15 +2849,27 @@ class HIPCHAT(object):
{'label': 'Hipchat Emoticon',
'value': self.emoticon,
'name': 'hipchat_emoticon',
- 'description': 'Include an emoticon tag at the beginning of all notifications (e.g. (taco)). Leave blank for none.'
+ 'description': 'Include an emoticon tag at the beginning of text notifications (e.g. (taco)). Leave blank for none.'
' Use a stock emoticon or create a custom emoticon'
' here.',
'input_type': 'text'
},
+ {'label': 'Include Poster',
+ 'value': self.incl_poster,
+ 'name': 'hipchat_incl_poster',
+ 'description': 'Include a poster in the notifications.
This will change the notification type to HTML and emoticons will no longer work.',
+ 'input_type': 'checkbox'
+ },
+ {'label': 'Include Link to Plex Web',
+ 'value': self.incl_pmslink,
+ 'name': 'hipchat_incl_pmslink',
+ 'description': 'Include a link to the media in Plex Web with the notifications.',
+ 'input_type': 'checkbox'
+ },
{'label': 'Include Subject Line',
'value': self.incl_subject,
'name': 'hipchat_incl_subject',
- 'description': 'Include the subject line with the notifications.',
+ 'description': 'Includes the subject with the notifications.',
'input_type': 'checkbox'
}
]