From 0b38fec8279fb489f1a9d845ead80e6299f069ca Mon Sep 17 00:00:00 2001 From: JonnyWong16 Date: Fri, 12 Jan 2018 00:35:37 -0800 Subject: [PATCH] Add more options for Join notifications --- data/interfaces/default/notifier_config.html | 12 +- plexpy/notification_handler.py | 2 +- plexpy/notifiers.py | 113 ++++++++++++++----- 3 files changed, 98 insertions(+), 29 deletions(-) diff --git a/data/interfaces/default/notifier_config.html b/data/interfaces/default/notifier_config.html index 5d2659be..53128205 100644 --- a/data/interfaces/default/notifier_config.html +++ b/data/interfaces/default/notifier_config.html @@ -136,7 +136,7 @@

- By default, all notifications will be sent if there are no conditions. Add custom conditions to only allow certain notifications. + Add custom conditions to only allow certain notifications. By default, all notifications will be sent if there are no conditions. Click here for a description of all the parameters.

@@ -533,6 +533,16 @@ email_to.setValue(${json.dumps(next((c['value'] for c in notifier['config_options'] if c['name'] == 'email_to'), [])) | n}); email_cc.setValue(${json.dumps(next((c['value'] for c in notifier['config_options'] if c['name'] == 'email_cc'), [])) | n}); email_bcc.setValue(${json.dumps(next((c['value'] for c in notifier['config_options'] if c['name'] == 'email_bcc'), [])) | n}); + + % elif notifier['agent_name'] == 'join': + var $join_device_names = $('#join_device_names').selectize({ + plugins: ['remove_button'], + maxItems: null, + create: true + }); + var join_device_names = $join_device_names[0].selectize; + console.log(${json.dumps(next((c['value'] for c in notifier['config_options'] if c['name'] == 'join_device_names'), [])) | n}); + join_device_names.setValue(${json.dumps(next((c['value'] for c in notifier['config_options'] if c['name'] == 'join_device_names'), [])) | n}); % endif function validateLogic() { diff --git a/plexpy/notification_handler.py b/plexpy/notification_handler.py index 174d125b..9c7764bb 100644 --- a/plexpy/notification_handler.py +++ b/plexpy/notification_handler.py @@ -535,7 +535,7 @@ def build_media_notify_params(notify_action=None, session=None, timeline=None, m notify_params['trakt_url'] = 'https://trakt.tv/search/imdb/' + notify_params['imdb_id'] if 'thetvdb://' in notify_params['guid']: - notify_params['thetvdb_id'] = notify_params['guid'].split('thetvdb://')[1].split('/')[0] + notify_params['thetvdb_id'] = notify_params['guid'].split('thetvdb://')[1].split('/')[0].split('?')[0] notify_params['thetvdb_url'] = 'https://thetvdb.com/?tab=series&id=' + notify_params['thetvdb_id'] notify_params['trakt_url'] = 'https://trakt.tv/search/tvdb/' + notify_params['thetvdb_id'] + '?id_type=show' diff --git a/plexpy/notifiers.py b/plexpy/notifiers.py index 5ec858c7..ec688817 100644 --- a/plexpy/notifiers.py +++ b/plexpy/notifiers.py @@ -624,9 +624,9 @@ class PrettyMetadata(object): poster_url = self.parameters['poster_url'] if not poster_url: if self.media_type in ('artist', 'album', 'track'): - poster_url = 'https://raw.githubusercontent.com/%s/plexpy/master/data/interfaces/default/images/cover.png' % plexpy.CONFIG.GIT_USER + poster_url = 'http://tautulli.com/images/cover.png' else: - poster_url = 'https://raw.githubusercontent.com/%s/plexpy/master/data/interfaces/default/images/poster.png' % plexpy.CONFIG.GIT_USER + poster_url = 'http://tautulli.com/images/poster.png' return poster_url def get_provider_name(self, provider): @@ -1965,23 +1965,53 @@ class JOIN(Notifier): """ NAME = 'Join' _DEFAULT_CONFIG = {'api_key': '', - 'device_id': '', - 'incl_subject': 1 + 'device_names': '', + 'priority': 2, + 'incl_subject': 1, + 'incl_poster': 0, + 'movie_provider': '', + 'tv_provider': '', + 'music_provider': '' } + def __init__(self, config=None): + super(JOIN, self).__init__(config=config) + + if not isinstance(self.config['device_names'], list): + self.config['device_names'] = [x.strip() for x in self.config['device_names'].split(',')] + def notify(self, subject='', body='', action='', **kwargs): if not subject or not body: return - deviceid_key = 'deviceId%s' % ('s' if len(self.config['device_id'].split(',')) > 1 else '') - data = {'apikey': self.config['api_key'], - deviceid_key: self.config['device_id'], + 'deviceNames': ','.join(self.config['device_names']), 'text': body.encode("utf-8")} if self.config['incl_subject']: data['title'] = subject.encode("utf-8") + if kwargs.get('parameters', {}).get('media_type'): + # Grab formatted metadata + pretty_metadata = PrettyMetadata(kwargs['parameters']) + + poster_url = pretty_metadata.get_poster_url() + if poster_url and self.config['incl_poster']: + data['icon'] = poster_url + + if pretty_metadata.media_type == 'movie': + provider = self.config['movie_provider'] + elif pretty_metadata.media_type in ('show', 'season', 'episode'): + provider = self.config['tv_provider'] + elif pretty_metadata.media_type in ('artist', 'album', 'track'): + provider = self.config['music_provider'] + else: + provider = None + + provider_link = pretty_metadata.get_provider_link(provider) + if provider_link: + data['url'] = provider_link + r = requests.post('https://joinjoaomgcd.appspot.com/_ah/api/messaging/v1/sendPush', params=data) if r.status_code == 200: @@ -1999,6 +2029,9 @@ class JOIN(Notifier): return False def get_devices(self): + devices = {d: d for d in self.config['device_names']} + devices.update({'': ''}) + if self.config['api_key']: params = {'apikey': self.config['api_key']} @@ -2007,28 +2040,22 @@ class JOIN(Notifier): if r.status_code == 200: response_data = r.json() if response_data.get('success'): - devices = response_data.get('records', []) - devices = {d['deviceId']: d['deviceName'] for d in devices} - devices.update({'': ''}) + response_devices = response_data.get('records', []) + devices.update({d['deviceName']: d['deviceName'] for d in response_devices}) return devices else: error_msg = response_data.get('errorMessage') logger.info(u"Tautulli Notifiers :: Unable to retrieve {name} devices list: {msg}".format(name=self.NAME, msg=error_msg)) - return {'': ''} + return devices else: logger.error(u"Tautulli Notifiers :: Unable to retrieve {name} devices list: [{r.status_code}] {r.reason}".format(name=self.NAME, r=r)) logger.debug(u"Tautulli Notifiers :: Request response: {}".format(request.server_message(r, True))) - return {'': ''} + return devices else: - return {'': ''} + return devices def return_config_options(self): - devices = '
'.join(['%s: %s' - % (v, k) for k, v in self.get_devices().iteritems() if k]) - if not devices: - devices = 'Enter your Join API key to load your device list.' - config_option = [{'label': 'Join API Key', 'value': self.config['api_key'], 'name': 'join_api_key', @@ -2036,22 +2063,54 @@ class JOIN(Notifier): 'input_type': 'text', 'refresh': True }, - {'label': 'Device ID(s) or Group ID', - 'value': self.config['device_id'], - 'name': 'join_device_id', - 'description': 'Set your Join device ID or group ID. ' \ - 'Separate multiple devices with commas (,).', - 'input_type': 'text', + {'label': 'Device Name(s)', + 'value': self.config['device_names'], + 'name': 'join_device_names', + 'description': 'Select your Join device(s).', + 'input_type': 'select', + 'select_options': self.get_devices() }, - {'label': 'Your Devices IDs', - 'description': devices, - 'input_type': 'help' + {'label': 'Priority', + 'value': self.config['priority'], + 'name': 'join_priority', + 'description': 'Set the notification priority.', + 'input_type': 'select', + 'select_options': {-2: -2, -1: -1, 0: 0, 1: 1, 2: 2} }, {'label': 'Include Subject Line', 'value': self.config['incl_subject'], 'name': 'join_incl_subject', 'description': 'Include the subject line with the notifications.', 'input_type': 'checkbox' + }, + {'label': 'Include Poster Image', + 'value': self.config['incl_poster'], + 'name': 'join_incl_poster', + 'description': 'Include a poster with the notifications.', + 'input_type': 'checkbox' + }, + {'label': 'Movie Link Source', + 'value': self.config['movie_provider'], + 'name': 'join_movie_provider', + 'description': 'Select the source for movie links on the info cards. Leave blank for default.
\ + 3rd party API lookup may need to be enabled under the notification settings tab.', + 'input_type': 'select', + 'select_options': PrettyMetadata().get_movie_providers() + }, + {'label': 'TV Show Link Source', + 'value': self.config['tv_provider'], + 'name': 'join_tv_provider', + 'description': 'Select the source for tv show links on the info cards. Leave blank for default.
\ + 3rd party API lookup may need to be enabled under the notification settings tab.', + 'input_type': 'select', + 'select_options': PrettyMetadata().get_tv_providers() + }, + {'label': 'Music Link Source', + 'value': self.config['music_provider'], + 'name': 'join_music_provider', + 'description': 'Select the source for music links on the info cards. Leave blank for default.', + 'input_type': 'select', + 'select_options': PrettyMetadata().get_music_providers() } ]