diff --git a/.gitignore b/.gitignore index 7aa4d20..2c35a6d 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ build *.egg-info *.db *.db-journal +*.png diff --git a/setup.py b/setup.py index 7affb80..593e81b 100644 --- a/setup.py +++ b/setup.py @@ -30,7 +30,8 @@ setup( "jsonpickle==3.0.1", "streamdeck==0.9.3", "pillow>=9.4.0,<10.0.0", - "svglib==1.5.1", + "cairosvg==2.7.0", + "ssdpy==0.4.1", ], keywords=[], entry_points={ diff --git a/streamdeckapi/const.py b/streamdeckapi/const.py index 29b979c..3791e68 100644 --- a/streamdeckapi/const.py +++ b/streamdeckapi/const.py @@ -5,3 +5,5 @@ VERSION = '0.0.3' PLUGIN_PORT = 6153 PLUGIN_INFO = "/sd/info" PLUGIN_ICON = "/sd/icon" + +SD_SSDP = "urn:home-assistant.io:device:stream-deck" diff --git a/streamdeckapi/server.py b/streamdeckapi/server.py index 9348903..26860e6 100644 --- a/streamdeckapi/server.py +++ b/streamdeckapi/server.py @@ -13,16 +13,14 @@ from aiohttp import web from StreamDeck.DeviceManager import DeviceManager from StreamDeck.Devices.StreamDeck import StreamDeck from StreamDeck.ImageHelpers import PILHelper -from svglib.svglib import svg2rlg +import cairosvg from PIL import Image +from ssdpy import SSDPServer -from streamdeckapi.const import PLUGIN_ICON, PLUGIN_INFO, PLUGIN_PORT +from streamdeckapi.const import PLUGIN_ICON, PLUGIN_INFO, PLUGIN_PORT, SD_SSDP from streamdeckapi.types import SDApplication, SDButton, SDButtonPosition, SDDevice -# TODO: MDI Icons not showing -# TODO: Text too small, positioning off # TODO: Websocket broadcast not working yet -# TODO: SSDP server DEFAULT_ICON = re.sub( @@ -292,13 +290,14 @@ def update_button_icon(uuid: str, svg: str): def set_icon(deck: StreamDeck, key: int, svg: str): """Draw an icon to the button.""" - svg_io = io.StringIO(svg) - drawing = svg2rlg(svg_io) - png_string = drawing.asString("png") - png_bytes = io.BytesIO(png_string) + png_bytes = io.BytesIO() + cairosvg.svg2png(svg.encode("utf-8"), write_to=png_bytes) + + # Debug + cairosvg.svg2png(svg.encode("utf-8"), write_to=f"icon_{key}.png") icon = Image.open(png_bytes) - image = PILHelper.create_scaled_image(deck, icon, margins=[0, 0, 20, 0]) + image = PILHelper.create_scaled_image(deck, icon) deck.set_key_image(key, PILHelper.to_native_format(deck, image)) @@ -357,3 +356,7 @@ def start(): loop = asyncio.get_event_loop() loop.run_until_complete(start_server()) loop.run_forever() + + # TODO: SSDP server + server = SSDPServer(SD_SSDP) + server.serve_forever()