diff --git a/plexpy/config.py b/plexpy/config.py index d53e8554..2c8c9928 100644 --- a/plexpy/config.py +++ b/plexpy/config.py @@ -212,6 +212,21 @@ _CONFIG_DEFINITIONS = { 'IFTTT_ON_INTUP': (int, 'IFTTT', 0), 'IFTTT_ON_PMSUPDATE': (int, 'IFTTT', 0), 'IMGUR_CLIENT_ID': (str, 'Monitoring', ''), + 'JOIN_APIKEY': (str, 'Join', ''), + 'JOIN_DEVICEID': (str, 'Join', ''), + 'JOIN_ENABLED': (int, 'Join', 0), + 'JOIN_ON_PLAY': (int, 'Join', 0), + 'JOIN_ON_STOP': (int, 'Join', 0), + 'JOIN_ON_PAUSE': (int, 'Join', 0), + 'JOIN_ON_RESUME': (int, 'Join', 0), + 'JOIN_ON_BUFFER': (int, 'Join', 0), + 'JOIN_ON_WATCHED': (int, 'Join', 0), + 'JOIN_ON_CREATED': (int, 'Join', 0), + 'JOIN_ON_EXTDOWN': (int, 'Join', 0), + 'JOIN_ON_INTDOWN': (int, 'Join', 0), + 'JOIN_ON_EXTUP': (int, 'Join', 0), + 'JOIN_ON_INTUP': (int, 'Join', 0), + 'JOIN_ON_PMSUPDATE': (int, 'Join', 0), 'JOURNAL_MODE': (str, 'Advanced', 'wal'), 'LAUNCH_BROWSER': (int, 'General', 1), 'LOG_BLACKLIST': (int, 'General', 1), diff --git a/plexpy/notifiers.py b/plexpy/notifiers.py index 00a48534..170a9069 100644 --- a/plexpy/notifiers.py +++ b/plexpy/notifiers.py @@ -65,7 +65,8 @@ AGENT_IDS = {"Growl": 0, "Slack": 14, "Scripts": 15, "Facebook": 16, - "Browser": 17} + "Browser": 17, + "Join": 18} def available_notification_agents(): @@ -374,6 +375,24 @@ def available_notification_agents(): 'on_extup': plexpy.CONFIG.BROWSER_ON_EXTUP, 'on_intup': plexpy.CONFIG.BROWSER_ON_INTUP, 'on_pmsupdate': plexpy.CONFIG.BROWSER_ON_PMSUPDATE + }, + {'name': 'Join', + 'id': AGENT_IDS['Join'], + 'config_prefix': 'join', + 'has_config': True, + 'state': checked(plexpy.CONFIG.JOIN_ENABLED), + 'on_play': plexpy.CONFIG.JOIN_ON_PLAY, + 'on_stop': plexpy.CONFIG.JOIN_ON_STOP, + 'on_pause': plexpy.CONFIG.JOIN_ON_PAUSE, + 'on_resume': plexpy.CONFIG.JOIN_ON_RESUME, + 'on_buffer': plexpy.CONFIG.JOIN_ON_BUFFER, + 'on_watched': plexpy.CONFIG.JOIN_ON_WATCHED, + 'on_created': plexpy.CONFIG.JOIN_ON_CREATED, + 'on_extdown': plexpy.CONFIG.JOIN_ON_EXTDOWN, + 'on_intdown': plexpy.CONFIG.JOIN_ON_INTDOWN, + 'on_extup': plexpy.CONFIG.JOIN_ON_EXTUP, + 'on_intup': plexpy.CONFIG.JOIN_ON_INTUP, + 'on_pmsupdate': plexpy.CONFIG.JOIN_ON_PMSUPDATE } ] @@ -460,6 +479,9 @@ def get_notification_agent_config(agent_id): elif agent_id == 17: browser = Browser() return browser.return_config_options() + elif agent_id == 18: + join = JOIN() + return join.return_config_options() else: return [] else: @@ -524,6 +546,9 @@ def send_notification(agent_id, subject, body, notify_action, **kwargs): elif agent_id == 17: browser = Browser() return browser.notify(subject=subject, message=body) + elif agent_id == 18: + join = JOIN() + return join.notify(message=body, subject=subject) else: logger.debug(u"PlexPy Notifiers :: Unknown agent id received.") else: @@ -953,8 +978,6 @@ class PUSHBULLET(object): if not message or not subject: return - http_handler = HTTPSConnection("api.pushbullet.com") - data = {'type': "note", 'title': subject.encode("utf-8"), 'body': message.encode("utf-8")} @@ -965,10 +988,11 @@ class PUSHBULLET(object): elif self.channel_tag: data['channel_tag'] = self.channel_tag + http_handler = HTTPSConnection("api.pushbullet.com") http_handler.request("POST", "/v2/pushes", headers={'Content-type': "application/json", - 'Authorization': 'Basic %s' % base64.b64encode(plexpy.CONFIG.PUSHBULLET_APIKEY + ":")}, + 'Authorization': 'Basic %s' % base64.b64encode(self.apikey + ":")}, body=json.dumps(data)) response = http_handler.getresponse() @@ -996,11 +1020,11 @@ class PUSHBULLET(object): self.notify('Main Screen Activate', 'Test Message') def get_devices(self): - if plexpy.CONFIG.PUSHBULLET_APIKEY: + if self.apikey: http_handler = HTTPSConnection("api.pushbullet.com") http_handler.request("GET", "/v2/devices", headers={'Content-type': "application/json", - 'Authorization': 'Basic %s' % base64.b64encode(plexpy.CONFIG.PUSHBULLET_APIKEY + ":")}) + 'Authorization': 'Basic %s' % base64.b64encode(self.apikey + ":")}) response = http_handler.getresponse() request_status = response.status @@ -2427,6 +2451,7 @@ class FacebookNotifier(object): return config_option + class Browser(object): def __init__(self): @@ -2484,4 +2509,113 @@ class Browser(object): } ] - return config_option \ No newline at end of file + return config_option return config_option + + +class JOIN(object): + + def __init__(self): + self.apikey = plexpy.CONFIG.JOIN_APIKEY + self.deviceid = plexpy.CONFIG.JOIN_DEVICEID + + def conf(self, options): + return cherrypy.config['config'].get('PUSHBULLET', options) + + def notify(self, message, subject): + if not message or not subject: + return + + deviceid_key = 'deviceId%s' % ('s' if len(self.deviceid.split(',')) > 1 else '') + + data = {'apikey': self.apikey, + deviceid_key: self.deviceid, + 'title': subject.encode("utf-8"), + 'text': message.encode("utf-8")} + + http_handler = HTTPSConnection("joinjoaomgcd.appspot.com") + http_handler.request("POST", + "/_ah/api/messaging/v1/sendPush?%s" % urlencode(data)) + + response = http_handler.getresponse() + request_status = response.status + # logger.debug(u"PushBullet response status: %r" % request_status) + # logger.debug(u"PushBullet response headers: %r" % response.getheaders()) + # logger.debug(u"PushBullet response body: %r" % response.read()) + + if request_status == 200: + data = json.loads(response.read()) + if data.get('success'): + logger.info(u"PlexPy Notifiers :: Join notification sent.") + return True + else: + error_msg = data.get('errorMessage') + logger.info(u"PlexPy Notifiers :: Join notification failed: %s" % error_msg) + return False + elif request_status >= 400 and request_status < 500: + logger.warn(u"PlexPy Notifiers :: Join notification failed: [%s] %s" % (request_status, response.reason)) + return False + else: + logger.warn(u"PlexPy Notifiers :: Join notification failed.") + return False + + def test(self, apikey, deviceid): + + self.enabled = True + self.apikey = apikey + self.deviceid = deviceid + + self.notify('Main Screen Activate', 'Test Message') + + def get_devices(self): + if self.apikey: + http_handler = HTTPSConnection("joinjoaomgcd.appspot.com") + http_handler.request("GET", + "/_ah/api/registration/v1/listDevices?%s" % urlencode({'apikey': self.apikey})) + + response = http_handler.getresponse() + request_status = response.status + + if request_status == 200: + data = json.loads(response.read()) + if data.get('success'): + devices = data.get('records', []) + devices = {d['deviceId']: d['deviceName'] for d in devices} + devices.update({'': ''}) + return devices + else: + error_msg = data.get('errorMessage') + logger.info(u"PlexPy Notifiers :: Unable to retrieve Join devices list: %s" % error_msg) + return {'': ''} + elif request_status >= 400 and request_status < 500: + logger.warn(u"PlexPy Notifiers :: Unable to retrieve Join devices list: %s" % response.reason) + return {'': ''} + else: + logger.warn(u"PlexPy Notifiers :: Unable to retrieve Join devices list.") + return {'': ''} + + else: + return {'': ''} + + def return_config_options(self): + devices = '
'.join(['%s: %s' % (v, k) for k, v in self.get_devices().iteritems() if k]) + + config_option = [{'label': 'Join API Key', + 'value': self.apikey, + 'name': 'join_apikey', + 'description': 'Your Join API key. Required for group notifications.', + 'input_type': 'text' + }, + {'label': 'Device ID(s) or Group ID', + 'value': self.deviceid, + 'name': 'join_deviceid', + 'description': 'Set your Join device ID or group ID. ' \ + 'Separate multiple devices with commas (,).', + 'input_type': 'text', + }, + {'label': 'Your Devices IDs', + 'description': devices, + 'input_type': 'help' + } + ] + + return config_option