2 changed files with 125 additions and 0 deletions
@ -0,0 +1,39 @@ |
|||||
|
from .main import Pushbullet |
||||
|
|
||||
|
def start(): |
||||
|
return Pushbullet() |
||||
|
|
||||
|
config = [{ |
||||
|
'name': 'pushbullet', |
||||
|
'groups': [ |
||||
|
{ |
||||
|
'tab': 'notifications', |
||||
|
'list': 'notification_providers', |
||||
|
'name': 'pushbullet', |
||||
|
'options': [ |
||||
|
{ |
||||
|
'name': 'enabled', |
||||
|
'default': 0, |
||||
|
'type': 'enabler', |
||||
|
}, |
||||
|
{ |
||||
|
'name': 'api_key', |
||||
|
'label': 'User API Key' |
||||
|
}, |
||||
|
{ |
||||
|
'name': 'devices', |
||||
|
'default': '', |
||||
|
'advanced': True, |
||||
|
'description': 'IDs of devices to send notifications to, empty = all devices' |
||||
|
}, |
||||
|
{ |
||||
|
'name': 'on_snatch', |
||||
|
'default': 0, |
||||
|
'type': 'bool', |
||||
|
'advanced': True, |
||||
|
'description': 'Also send message when movie is snatched.', |
||||
|
}, |
||||
|
], |
||||
|
} |
||||
|
], |
||||
|
}] |
@ -0,0 +1,86 @@ |
|||||
|
from couchpotato.core.helpers.encoding import toUnicode |
||||
|
from couchpotato.core.helpers.variable import tryInt |
||||
|
from couchpotato.core.logger import CPLog |
||||
|
from couchpotato.core.notifications.base import Notification |
||||
|
import base64 |
||||
|
import json |
||||
|
|
||||
|
log = CPLog(__name__) |
||||
|
|
||||
|
|
||||
|
class Pushbullet(Notification): |
||||
|
|
||||
|
url = 'https://api.pushbullet.com/api/%s' |
||||
|
|
||||
|
def notify(self, message = '', data = None, listener = None): |
||||
|
if not data: data = {} |
||||
|
|
||||
|
devices = self.getDevices() |
||||
|
if devices is None: |
||||
|
return False |
||||
|
|
||||
|
# Get all the device IDs linked to this user |
||||
|
if not len(devices): |
||||
|
response = self.request('devices') |
||||
|
if not response: |
||||
|
return False |
||||
|
|
||||
|
devices += [device.get('id') for device in response['devices']] |
||||
|
|
||||
|
successful = 0 |
||||
|
for device in devices: |
||||
|
response = self.request( |
||||
|
'pushes', |
||||
|
cache = False, |
||||
|
device_id = device, |
||||
|
type = 'note', |
||||
|
title = self.default_title, |
||||
|
body = toUnicode(message) |
||||
|
) |
||||
|
|
||||
|
if response: |
||||
|
successful += 1 |
||||
|
else: |
||||
|
log.error('Unable to push notification to Pushbullet device with ID %s' % device) |
||||
|
|
||||
|
return successful == len(devices) |
||||
|
|
||||
|
def getDevices(self): |
||||
|
devices = [d.strip() for d in self.conf('devices').split(',')] |
||||
|
|
||||
|
# Remove empty items |
||||
|
devices = [d for d in devices if len(d)] |
||||
|
|
||||
|
# Break on any ids that aren't integers |
||||
|
valid_devices = [] |
||||
|
|
||||
|
for device_id in devices: |
||||
|
d = tryInt(device_id, None) |
||||
|
|
||||
|
if not d: |
||||
|
log.error('Device ID "%s" is not valid', device_id) |
||||
|
return None |
||||
|
|
||||
|
valid_devices.append(d) |
||||
|
|
||||
|
return valid_devices |
||||
|
|
||||
|
def request(self, method, cache = True, **kwargs): |
||||
|
try: |
||||
|
base64string = base64.encodestring('%s:' % self.conf('api_key'))[:-1] |
||||
|
|
||||
|
headers = { |
||||
|
"Authorization": "Basic %s" % base64string |
||||
|
} |
||||
|
|
||||
|
if cache: |
||||
|
return self.getJsonData(self.url % method, headers = headers, params = kwargs) |
||||
|
else: |
||||
|
data = self.urlopen(self.url % method, headers = headers, params = kwargs) |
||||
|
return json.loads(data) |
||||
|
|
||||
|
except Exception, ex: |
||||
|
log.error('Pushbullet request failed') |
||||
|
log.debug(ex) |
||||
|
|
||||
|
return None |
Loading…
Reference in new issue