145 lines
5.5 KiB
Python
145 lines
5.5 KiB
Python
#!/usr/bin/env python
|
|
import xbmc
|
|
import xbmcgui
|
|
import xbmcaddon
|
|
import json
|
|
import urllib.request
|
|
import logging
|
|
|
|
# Initialize the logger
|
|
logging.basicConfig(level=logging.DEBUG)
|
|
logger = logging.getLogger(__name__)
|
|
|
|
ADDON = xbmcaddon.Addon()
|
|
ADDONID = xbmcaddon.Addon().getAddonInfo('id')
|
|
CWD = xbmcaddon.Addon().getAddonInfo('path')
|
|
API_URL = ADDON.getSetting('api_url')
|
|
|
|
CANCEL_DIALOG = (9, 10, 92, 216, 247, 257, 275, 61467, 61448)
|
|
|
|
def send_request(endpoint, data=None):
|
|
url = f"{API_URL}{endpoint}"
|
|
if data is not None:
|
|
data = json.dumps(data).encode('utf-8')
|
|
req = urllib.request.Request(url, data, headers={'Content-Type': 'application/json'})
|
|
response = urllib.request.urlopen(req)
|
|
if response.status > 300:
|
|
res = json.loads(response.read().decode('utf-8'))
|
|
xbmcgui.Dialog().notification('Error', f"Failed to create dialog: {res['errmsg']}", xbmcgui.NOTIFICATION_ERROR)
|
|
raise Exception(res["errmsg"])
|
|
return json.loads(response.read().decode('utf-8'))
|
|
|
|
|
|
# Sources ##########################################################
|
|
|
|
def get_sources():
|
|
sources = send_request("/sources")
|
|
res = []
|
|
for src in sources:
|
|
source = sources[src]
|
|
source["id"] = src
|
|
res.append(source)
|
|
return res
|
|
|
|
def get_current_source():
|
|
sources = send_request("/sources")
|
|
for src in sources:
|
|
source = sources[src]
|
|
if source["enabled"]:
|
|
return sources[src]["name"]
|
|
return None
|
|
|
|
def enable_source(src):
|
|
send_request("/sources/" + src + "/enable", {})
|
|
return True
|
|
|
|
|
|
# Mixer ############################################################
|
|
|
|
def get_mixers():
|
|
return send_request("/mixer")
|
|
|
|
def mixer_value(mixer):
|
|
if mixer["Type"] == "ENUMERATED":
|
|
return str(mixer["items"][mixer["values"][0]])
|
|
elif mixer["Type"] == "BOOLEAN":
|
|
return "Oui" if mixer["items"][mixer["values"][0]] else "Non"
|
|
elif mixer["Type"] == "INTEGER" and "DBScale" in mixer:
|
|
return "%0.1f dB" % (mixer["DBScale"]["Min"] + mixer["DBScale"]["Step"] * mixer["values"][0])
|
|
else:
|
|
return str(mixer["values"][0])
|
|
|
|
def set_mixer(mixer, value):
|
|
val = []
|
|
for v in mixer["values"]:
|
|
val.append(value)
|
|
send_request("/mixer/%s/values" % mixer["NumID"], val)
|
|
return True
|
|
|
|
|
|
class AmplifierControlDialog(xbmcgui.WindowXMLDialog):
|
|
def __init__(self, *args, **kwargs):
|
|
super(AmplifierControlDialog, self).__init__(*args, **kwargs)
|
|
self.data = kwargs['optional1']
|
|
|
|
def onInit(self):
|
|
self.getControl(2).setLabel("Hathoris")
|
|
|
|
self.list = self.getControl(10)
|
|
self.list.reset()
|
|
self.list.addItem(xbmcgui.ListItem("Source", get_current_source()))
|
|
|
|
self.mixers = get_mixers()
|
|
for mixer in self.mixers:
|
|
self.list.addItem(xbmcgui.ListItem(mixer["Name"], mixer_value(mixer)))
|
|
|
|
#self.getControl(100).setLabel("Volume")
|
|
#self.getControl(200).setLabel("Source")
|
|
return
|
|
|
|
def onClick(self, controlId):
|
|
if controlId == 10:
|
|
if self.list.getSelectedPosition() == 0:
|
|
sources = get_sources()
|
|
selected = xbmcgui.Dialog().select('Sélectionnez la source à utiliser', [s["name"] for s in sources])
|
|
if selected != -1:
|
|
enable_source(sources[selected]["id"])
|
|
self.onInit()
|
|
elif self.mixers[self.list.getSelectedPosition() - 1]["Type"] == "ENUMERATED":
|
|
items = self.mixers[self.list.getSelectedPosition() - 1]["items"]
|
|
selected = xbmcgui.Dialog().select(self.mixers[self.list.getSelectedPosition() - 1]["Name"], items, preselect=self.mixers[self.list.getSelectedPosition() - 1]["values"][0])
|
|
if selected != -1:
|
|
set_mixer(self.mixers[self.list.getSelectedPosition() - 1], selected)
|
|
self.onInit()
|
|
elif self.mixers[self.list.getSelectedPosition() - 1]["Type"] == "BOOLEAN":
|
|
items = ["Non", "Oui"]
|
|
selected = xbmcgui.Dialog().select(self.mixers[self.list.getSelectedPosition() - 1]["Name"], items, preselect=1 if self.mixers[self.list.getSelectedPosition() - 1]["values"][0] else 0)
|
|
if selected != -1:
|
|
set_mixer(self.mixers[self.list.getSelectedPosition() - 1], True if selected else False)
|
|
self.onInit()
|
|
else:
|
|
newval = xbmcgui.Dialog().numeric(0, self.mixers[self.list.getSelectedPosition() - 1]["Name"], str(self.mixers[self.list.getSelectedPosition() - 1]["values"][0]))
|
|
set_mixer(self.mixers[self.list.getSelectedPosition() - 1], int(newval))
|
|
self.onInit()
|
|
elif controlId == 100:
|
|
volume = self.getControl(101).getValue()
|
|
send_request('set_volume', {'volume': volume})
|
|
elif controlId == 200:
|
|
source = self.getControl(201).getSelectedItem().getLabel()
|
|
send_request('set_source', {'source': source})
|
|
elif controlId == 18:
|
|
self.close()
|
|
|
|
def onAction(self, action):
|
|
if action.getButtonCode() in CANCEL_DIALOG:
|
|
self.close()
|
|
|
|
if __name__ == '__main__':
|
|
try:
|
|
dialog = AmplifierControlDialog('amplifier_control.xml', CWD, 'default', optional1='some data')
|
|
dialog.doModal()
|
|
del dialog
|
|
except Exception as e:
|
|
logger.error(f"Failed to create dialog: {e}")
|
|
xbmcgui.Dialog().notification('Error', f"Failed to create dialog: {e}", xbmcgui.NOTIFICATION_ERROR)
|