Browse Source

XBMC notifier for Frodo & Eden

pull/1244/head
Ruud 13 years ago
parent
commit
36fee69843
  1. 2
      couchpotato/core/notifications/xbmc/__init__.py
  2. 72
      couchpotato/core/notifications/xbmc/main.py

2
couchpotato/core/notifications/xbmc/__init__.py

@ -10,7 +10,7 @@ config = [{
'tab': 'notifications', 'tab': 'notifications',
'name': 'xbmc', 'name': 'xbmc',
'label': 'XBMC', 'label': 'XBMC',
'description': 'v11 (Dharma) and v12 (Frodo)', 'description': 'v11 (Eden) and v12 (Frodo)',
'options': [ 'options': [
{ {
'name': 'enabled', 'name': 'enabled',

72
couchpotato/core/notifications/xbmc/main.py

@ -12,44 +12,44 @@ log = CPLog(__name__)
class XBMC(Notification): class XBMC(Notification):
listen_to = ['renamer.after'] listen_to = ['renamer.after']
firstRun = True use_json_notifications = {}
useJSONnotifications = True
def notify(self, message = '', data = {}, listener = None): def notify(self, message = '', data = {}, listener = None):
if self.isDisabled(): return if self.isDisabled(): return
hosts = splitString(self.conf('host')) hosts = splitString(self.conf('host'))
if self.firstRun or listener == "test" : return self.getXBMCJSONversion(hosts, message=message )
successful = 0 successful = 0
for host in hosts: for host in hosts:
if self.useJSONnotifications:
if self.use_json_notifications.get(host) is None:
self.getXBMCJSONversion(host, message = message)
if self.use_json_notifications.get(host):
response = self.request(host, [ response = self.request(host, [
('GUI.ShowNotification', {"title":self.default_title, "message":message}), ('GUI.ShowNotification', {'title':self.default_title, 'message':message}),
('VideoLibrary.Scan', {}), ('VideoLibrary.Scan', {}),
]) ])
else: else:
response = self.notifyXBMCnoJSON(host, {'title':self.default_title,'message':message}) response = self.notifyXBMCnoJSON(host, {'title':self.default_title, 'message':message})
response += self.request(host, [('VideoLibrary.Scan', {})]) response += self.request(host, [('VideoLibrary.Scan', {})])
try: try:
for result in response: for result in response:
if (result.get('result') and result['result'] == "OK"): if (result.get('result') and result['result'] == 'OK'):
successful += 1 successful += 1
elif (result.get('error')): elif (result.get('error')):
log.error("XBMC error; %s: %s (%s)", (result['id'], result['error']['message'], result['error']['code'])) log.error('XBMC error; %s: %s (%s)', (result['id'], result['error']['message'], result['error']['code']))
except: except:
log.error('Failed parsing results: %s', traceback.format_exc()) log.error('Failed parsing results: %s', traceback.format_exc())
return successful == len(hosts) * 2 return successful == len(hosts) * 2
# TODO: implement multiple hosts support, for now the last host of the 'hosts' array def getXBMCJSONversion(self, host, message = ''):
# sets 'useJSONnotifications'
def getXBMCJSONversion(self, hosts, message=''): success = False
success = 0
for host in hosts:
# XBMC JSON-RPC version request # XBMC JSON-RPC version request
response = self.request(host, [ response = self.request(host, [
('JSONRPC.Version', {}) ('JSONRPC.Version', {})
@ -60,54 +60,50 @@ class XBMC(Notification):
# v6 (as of XBMC v12(Frodo)) is required to send notifications # v6 (as of XBMC v12(Frodo)) is required to send notifications
xbmc_rpc_version = str(result['result']['version']) xbmc_rpc_version = str(result['result']['version'])
log.debug("XBMC JSON-RPC Version: %s ; Notifications by JSON-RPC only supported for v6 [as of XBMC v12(Frodo)]", xbmc_rpc_version) log.debug('XBMC JSON-RPC Version: %s ; Notifications by JSON-RPC only supported for v6 [as of XBMC v12(Frodo)]', xbmc_rpc_version)
# disable JSON use # disable JSON use
self.useJSONnotifications = False self.use_json_notifications[host] = False
# send the text message # send the text message
resp = self.notifyXBMCnoJSON(host, {'title':self.default_title,'message':message}) resp = self.notifyXBMCnoJSON(host, {'title':self.default_title, 'message':message})
for result in resp: for result in resp:
if (result.get('result') and result['result'] == "OK"): if (result.get('result') and result['result'] == 'OK'):
log.debug("Message delivered successfully!") log.debug('Message delivered successfully!')
success = True success = True
break break
elif (result.get('error')): elif (result.get('error')):
log.error("XBMC error; %s: %s (%s)", (result['id'], result['error']['message'], result['error']['code'])) log.error('XBMC error; %s: %s (%s)', (result['id'], result['error']['message'], result['error']['code']))
break break
elif (result.get('result') and type(result['result']['version']).__name__ == 'dict'): elif (result.get('result') and type(result['result']['version']).__name__ == 'dict'):
# XBMC JSON-RPC v6 returns an array object containing # XBMC JSON-RPC v6 returns an array object containing
# major, minor and patch number # major, minor and patch number
xbmc_rpc_version = str(result['result']['version']['major']) xbmc_rpc_version = str(result['result']['version']['major'])
xbmc_rpc_version += "." + str(result['result']['version']['minor']) xbmc_rpc_version += '.' + str(result['result']['version']['minor'])
xbmc_rpc_version += "." + str(result['result']['version']['patch']) xbmc_rpc_version += '.' + str(result['result']['version']['patch'])
log.debug("XBMC JSON-RPC Version: %s", xbmc_rpc_version) log.debug('XBMC JSON-RPC Version: %s', xbmc_rpc_version)
# ok, XBMC version is supported # ok, XBMC version is supported
self.useJSONnotifications = True self.use_json_notifications[host] = True
# send the text message # send the text message
resp = self.request(host, [('GUI.ShowNotification', {"title":self.default_title, "message":message})]) resp = self.request(host, [('GUI.ShowNotification', {'title':self.default_title, 'message':message})])
for result in resp: for result in resp:
if (result.get('result') and result['result'] == "OK"): if (result.get('result') and result['result'] == 'OK'):
log.debug("Message delivered successfully!") log.debug('Message delivered successfully!')
success = True success = True
break break
elif (result.get('error')): elif (result.get('error')):
log.error("XBMC error; %s: %s (%s)", (result['id'], result['error']['message'], result['error']['code'])) log.error('XBMC error; %s: %s (%s)', (result['id'], result['error']['message'], result['error']['code']))
break break
# error getting version info (we do have contact with XBMC though) # error getting version info (we do have contact with XBMC though)
elif (result.get('error')): elif (result.get('error')):
log.error("XBMC error; %s: %s (%s)", (result['id'], result['error']['message'], result['error']['code'])) log.error('XBMC error; %s: %s (%s)', (result['id'], result['error']['message'], result['error']['code']))
# set boolean so we only run this once after boot
# in func notify() ignored for 'test' messages
self.firstRun = False
log.debug("use JSON notifications: %s ", self.useJSONnotifications) log.debug('Use JSON notifications: %s ', self.use_json_notifications)
return success return success
@ -116,7 +112,7 @@ class XBMC(Notification):
server = 'http://%s/xbmcCmds/' % host server = 'http://%s/xbmcCmds/' % host
# title, message [, timeout , image #can be added!] # title, message [, timeout , image #can be added!]
cmd = 'xbmcHttp?command=ExecBuiltIn(Notification("%s","%s"))' % (urllib.quote(data['title']), urllib.quote(data['message'])) cmd = "xbmcHttp?command=ExecBuiltIn(Notification('%s','%s'))" % (urllib.quote(data['title']), urllib.quote(data['message']))
server += cmd server += cmd
# I have no idea what to set to, just tried text/plain and seems to be working :) # I have no idea what to set to, just tried text/plain and seems to be working :)
@ -144,18 +140,18 @@ class XBMC(Notification):
# #
response = self.urlopen(server, headers = headers) response = self.urlopen(server, headers = headers)
if "OK" in response: if 'OK' in response:
log.debug('Returned from non-JSON-type request %s: %s', (host, response)) log.debug('Returned from non-JSON-type request %s: %s', (host, response))
# manually fake expected response array # manually fake expected response array
return [{"result": "OK"}] return [{'result': 'OK'}]
else: else:
log.error('Returned from non-JSON-type request %s: %s', (host, response)) log.error('Returned from non-JSON-type request %s: %s', (host, response))
# manually fake expected response array # manually fake expected response array
return [{"result": "Error"}] return [{'result': 'Error'}]
except: except:
log.error('Failed sending non-JSON-type request to XBMC: %s', traceback.format_exc()) log.error('Failed sending non-JSON-type request to XBMC: %s', traceback.format_exc())
return [{"result": "Error"}] return [{'result': 'Error'}]
def request(self, host, requests): def request(self, host, requests):
server = 'http://%s/jsonrpc' % host server = 'http://%s/jsonrpc' % host

Loading…
Cancel
Save