XBMC notifier for Frodo & Eden
This commit is contained in:
1 parent
c5cae5ab9b
commit
36fee69843
2 files changed
+63
-67
No files matched your search
@@ -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',
|
||||||
|
|||||||
@@ -12,102 +12,98 @@ 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 = 0
|
success = False
|
||||||
for host in hosts:
|
|
||||||
# XBMC JSON-RPC version request
|
|
||||||
response = self.request(host, [
|
|
||||||
('JSONRPC.Version', {})
|
|
||||||
])
|
|
||||||
for result in response:
|
|
||||||
if (result.get('result') and type(result['result']['version']).__name__ == 'int'):
|
|
||||||
# only v2 and v4 return an int object
|
|
||||||
# v6 (as of XBMC v12(Frodo)) is required to send notifications
|
|
||||||
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)
|
# XBMC JSON-RPC version request
|
||||||
|
response = self.request(host, [
|
||||||
|
('JSONRPC.Version', {})
|
||||||
|
])
|
||||||
|
for result in response:
|
||||||
|
if (result.get('result') and type(result['result']['version']).__name__ == 'int'):
|
||||||
|
# only v2 and v4 return an int object
|
||||||
|
# v6 (as of XBMC v12(Frodo)) is required to send notifications
|
||||||
|
xbmc_rpc_version = str(result['result']['version'])
|
||||||
|
|
||||||
# disable JSON use
|
log.debug('XBMC JSON-RPC Version: %s ; Notifications by JSON-RPC only supported for v6 [as of XBMC v12(Frodo)]', xbmc_rpc_version)
|
||||||
self.useJSONnotifications = False
|
|
||||||
|
|
||||||
# send the text message
|
# disable JSON use
|
||||||
resp = self.notifyXBMCnoJSON(host, {'title':self.default_title,'message':message})
|
self.use_json_notifications[host] = False
|
||||||
for result in resp:
|
|
||||||
if (result.get('result') and result['result'] == "OK"):
|
|
||||||
log.debug("Message delivered successfully!")
|
|
||||||
success = True
|
|
||||||
break
|
|
||||||
elif (result.get('error')):
|
|
||||||
log.error("XBMC error; %s: %s (%s)", (result['id'], result['error']['message'], result['error']['code']))
|
|
||||||
break
|
|
||||||
|
|
||||||
elif (result.get('result') and type(result['result']['version']).__name__ == 'dict'):
|
# send the text message
|
||||||
# XBMC JSON-RPC v6 returns an array object containing
|
resp = self.notifyXBMCnoJSON(host, {'title':self.default_title, 'message':message})
|
||||||
# major, minor and patch number
|
for result in resp:
|
||||||
xbmc_rpc_version = str(result['result']['version']['major'])
|
if (result.get('result') and result['result'] == 'OK'):
|
||||||
xbmc_rpc_version += "." + str(result['result']['version']['minor'])
|
log.debug('Message delivered successfully!')
|
||||||
xbmc_rpc_version += "." + str(result['result']['version']['patch'])
|
success = True
|
||||||
|
break
|
||||||
|
elif (result.get('error')):
|
||||||
|
log.error('XBMC error; %s: %s (%s)', (result['id'], result['error']['message'], result['error']['code']))
|
||||||
|
break
|
||||||
|
|
||||||
log.debug("XBMC JSON-RPC Version: %s", xbmc_rpc_version)
|
elif (result.get('result') and type(result['result']['version']).__name__ == 'dict'):
|
||||||
|
# XBMC JSON-RPC v6 returns an array object containing
|
||||||
|
# major, minor and patch number
|
||||||
|
xbmc_rpc_version = str(result['result']['version']['major'])
|
||||||
|
xbmc_rpc_version += '.' + str(result['result']['version']['minor'])
|
||||||
|
xbmc_rpc_version += '.' + str(result['result']['version']['patch'])
|
||||||
|
|
||||||
# ok, XBMC version is supported
|
log.debug('XBMC JSON-RPC Version: %s', xbmc_rpc_version)
|
||||||
self.useJSONnotifications = True
|
|
||||||
|
|
||||||
# send the text message
|
# ok, XBMC version is supported
|
||||||
resp = self.request(host, [('GUI.ShowNotification', {"title":self.default_title, "message":message})])
|
self.use_json_notifications[host] = True
|
||||||
for result in resp:
|
|
||||||
if (result.get('result') and result['result'] == "OK"):
|
|
||||||
log.debug("Message delivered successfully!")
|
|
||||||
success = True
|
|
||||||
break
|
|
||||||
elif (result.get('error')):
|
|
||||||
log.error("XBMC error; %s: %s (%s)", (result['id'], result['error']['message'], result['error']['code']))
|
|
||||||
break
|
|
||||||
|
|
||||||
# error getting version info (we do have contact with XBMC though)
|
# send the text message
|
||||||
elif (result.get('error')):
|
resp = self.request(host, [('GUI.ShowNotification', {'title':self.default_title, 'message':message})])
|
||||||
log.error("XBMC error; %s: %s (%s)", (result['id'], result['error']['message'], result['error']['code']))
|
for result in resp:
|
||||||
|
if (result.get('result') and result['result'] == 'OK'):
|
||||||
|
log.debug('Message delivered successfully!')
|
||||||
|
success = True
|
||||||
|
break
|
||||||
|
elif (result.get('error')):
|
||||||
|
log.error('XBMC error; %s: %s (%s)', (result['id'], result['error']['message'], result['error']['code']))
|
||||||
|
break
|
||||||
|
|
||||||
# set boolean so we only run this once after boot
|
# error getting version info (we do have contact with XBMC though)
|
||||||
# in func notify() ignored for 'test' messages
|
elif (result.get('error')):
|
||||||
self.firstRun = False
|
log.error('XBMC error; %s: %s (%s)', (result['id'], result['error']['message'], result['error']['code']))
|
||||||
|
|
||||||
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
|
||||||
|
|||||||
Reference in new issue
Block a user