added basic api routes
This commit is contained in:
14
setup.py
14
setup.py
@@ -9,7 +9,7 @@ here = os.path.abspath(os.path.dirname(__file__))
|
|||||||
with codecs.open(os.path.join(here, "README.md"), encoding="utf-8") as fh:
|
with codecs.open(os.path.join(here, "README.md"), encoding="utf-8") as fh:
|
||||||
long_description = "\n" + fh.read()
|
long_description = "\n" + fh.read()
|
||||||
|
|
||||||
DESCRIPTION = 'Stream Deck API Library'
|
DESCRIPTION = "Stream Deck API Library"
|
||||||
|
|
||||||
# Setting up
|
# Setting up
|
||||||
setup(
|
setup(
|
||||||
@@ -22,8 +22,14 @@ setup(
|
|||||||
long_description=long_description,
|
long_description=long_description,
|
||||||
url="https://github.com/Patrick762/streamdeckapi",
|
url="https://github.com/Patrick762/streamdeckapi",
|
||||||
packages=find_packages(),
|
packages=find_packages(),
|
||||||
install_requires=["requests==2.28.2", "websockets==11.0.2",
|
install_requires=[
|
||||||
"streamdeck==0.9.3", "pillow>=9.4.0,<10.0.0"],
|
"requests==2.28.2",
|
||||||
|
"websockets==11.0.2",
|
||||||
|
"aiohttp==3.8.4",
|
||||||
|
"human-readable-ids==0.1.3",
|
||||||
|
"streamdeck==0.9.3",
|
||||||
|
"pillow>=9.4.0,<10.0.0",
|
||||||
|
],
|
||||||
keywords=[],
|
keywords=[],
|
||||||
entry_points={
|
entry_points={
|
||||||
"console_scripts": ["streamdeckapi-server = streamdeckapi.server:start"]
|
"console_scripts": ["streamdeckapi-server = streamdeckapi.server:start"]
|
||||||
@@ -35,5 +41,5 @@ setup(
|
|||||||
"Operating System :: Unix",
|
"Operating System :: Unix",
|
||||||
"Operating System :: MacOS :: MacOS X",
|
"Operating System :: MacOS :: MacOS X",
|
||||||
"Operating System :: Microsoft :: Windows",
|
"Operating System :: Microsoft :: Windows",
|
||||||
]
|
],
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,48 +1,65 @@
|
|||||||
"""Stream Deck API Server."""
|
"""Stream Deck API Server."""
|
||||||
|
|
||||||
from StreamDeck.DeviceManager import DeviceManager
|
import aiohttp
|
||||||
|
import asyncio
|
||||||
|
from aiohttp import web, WSCloseCode
|
||||||
|
|
||||||
|
# from StreamDeck.DeviceManager import DeviceManager
|
||||||
from streamdeckapi.const import PLUGIN_ICON, PLUGIN_INFO, PLUGIN_PORT
|
from streamdeckapi.const import PLUGIN_ICON, PLUGIN_INFO, PLUGIN_PORT
|
||||||
|
|
||||||
# Prints diagnostic information about a given StreamDeck.
|
|
||||||
def print_deck_info(index, deck):
|
|
||||||
image_format = deck.key_image_format()
|
|
||||||
|
|
||||||
flip_description = {
|
async def api_info_handler(request: web.Request):
|
||||||
(False, False): "not mirrored",
|
return web.Response(text="Info")
|
||||||
(True, False): "mirrored horizontally",
|
|
||||||
(False, True): "mirrored vertically",
|
|
||||||
(True, True): "mirrored horizontally/vertically",
|
|
||||||
}
|
|
||||||
|
|
||||||
print("Deck {} - {}.".format(index, deck.deck_type()))
|
|
||||||
print("\t - ID: {}".format(deck.id()))
|
|
||||||
print("\t - Serial: '{}'".format(deck.get_serial_number()))
|
|
||||||
print("\t - Firmware Version: '{}'".format(deck.get_firmware_version()))
|
|
||||||
print("\t - Key Count: {} (in a {}x{} grid)".format(
|
|
||||||
deck.key_count(),
|
|
||||||
deck.key_layout()[0],
|
|
||||||
deck.key_layout()[1]))
|
|
||||||
if deck.is_visual():
|
|
||||||
print("\t - Key Images: {}x{} pixels, {} format, rotated {} degrees, {}".format(
|
|
||||||
image_format['size'][0],
|
|
||||||
image_format['size'][1],
|
|
||||||
image_format['format'],
|
|
||||||
image_format['rotation'],
|
|
||||||
flip_description[image_format['flip']]))
|
|
||||||
else:
|
|
||||||
print("\t - No Visual Output")
|
|
||||||
|
|
||||||
def start():
|
async def api_icon_get_handler(request: web.Request):
|
||||||
streamdecks = DeviceManager().enumerate()
|
btnId = request.match_info["btnId"]
|
||||||
|
return web.Response(text="Icon get")
|
||||||
|
|
||||||
print("Found {} Stream Deck(s).\n".format(len(streamdecks)))
|
|
||||||
|
|
||||||
|
async def api_icon_set_handler(request: web.Request):
|
||||||
|
btnId = request.match_info["btnId"]
|
||||||
|
body = await request.text()
|
||||||
|
print(body)
|
||||||
|
return web.Response(text="Icon set")
|
||||||
|
|
||||||
|
|
||||||
|
async def websocket_handler(request: web.Request):
|
||||||
|
ws = web.WebSocketResponse()
|
||||||
|
await ws.prepare(request)
|
||||||
|
async for msg in ws:
|
||||||
|
if msg.type == aiohttp.WSMsgType.TEXT:
|
||||||
|
if msg.data == "close":
|
||||||
|
await ws.close()
|
||||||
|
else:
|
||||||
|
await ws.send_str("some websocket message payload")
|
||||||
|
elif msg.type == aiohttp.WSMsgType.ERROR:
|
||||||
|
print("ws connection closed with exception %s" % ws.exception())
|
||||||
|
return ws
|
||||||
|
|
||||||
|
|
||||||
|
def create_runner():
|
||||||
|
app = web.Application()
|
||||||
|
app.add_routes(
|
||||||
|
[
|
||||||
|
web.get("/", websocket_handler),
|
||||||
|
web.get(PLUGIN_INFO, api_info_handler),
|
||||||
|
web.get(PLUGIN_ICON + "/{btnId}", api_icon_get_handler),
|
||||||
|
web.post(PLUGIN_ICON + "/{btnId}", api_icon_set_handler),
|
||||||
|
]
|
||||||
|
)
|
||||||
|
return web.AppRunner(app)
|
||||||
|
|
||||||
|
|
||||||
|
async def start_server(host="0.0.0.0", port=PLUGIN_PORT):
|
||||||
|
runner = create_runner()
|
||||||
|
await runner.setup()
|
||||||
|
site = web.TCPSite(runner, host, port)
|
||||||
|
await site.start()
|
||||||
print("Started Stream Deck API server on port", PLUGIN_PORT)
|
print("Started Stream Deck API server on port", PLUGIN_PORT)
|
||||||
|
|
||||||
for index, deck in enumerate(streamdecks):
|
|
||||||
deck.open()
|
|
||||||
deck.reset()
|
|
||||||
|
|
||||||
print_deck_info(index, deck)
|
def start():
|
||||||
|
loop = asyncio.get_event_loop()
|
||||||
deck.close()
|
loop.run_until_complete(start_server())
|
||||||
|
loop.run_forever()
|
||||||
|
|||||||
Reference in New Issue
Block a user