2020-11-15 17:40:18 +00:00
|
|
|
import asyncio
|
|
|
|
import websockets
|
|
|
|
import json
|
|
|
|
|
|
|
|
baps_clients = set()
|
|
|
|
channel_to_q = None
|
2020-11-15 17:48:05 +00:00
|
|
|
server_name = None
|
2020-11-15 17:40:18 +00:00
|
|
|
|
|
|
|
|
|
|
|
async def websocket_handler(websocket, path):
|
|
|
|
baps_clients.add(websocket)
|
2020-11-15 17:48:05 +00:00
|
|
|
await websocket.send(json.dumps({"message": "Hello", "serverName": server_name}))
|
2020-11-15 17:40:18 +00:00
|
|
|
print("New Client: {}".format(websocket))
|
|
|
|
|
|
|
|
try:
|
|
|
|
async for message in websocket:
|
|
|
|
data = json.loads(message)
|
|
|
|
channel = int(data["channel"])
|
|
|
|
if "command" in data.keys():
|
|
|
|
if data["command"] == "PLAY":
|
|
|
|
channel_to_q[channel].put("PLAY")
|
|
|
|
elif data["command"] == "PAUSE":
|
|
|
|
channel_to_q[channel].put("PAUSE")
|
|
|
|
elif data["command"] == "UNPAUSE":
|
|
|
|
channel_to_q[channel].put("UNPAUSE")
|
|
|
|
elif data["command"] == "STOP":
|
|
|
|
channel_to_q[channel].put("STOP")
|
|
|
|
elif data["command"] == "SEEK":
|
|
|
|
channel_to_q[channel].put("SEEK:" + str(data["time"]))
|
|
|
|
elif data["command"] == "LOAD":
|
2020-11-15 19:34:13 +00:00
|
|
|
channel_to_q[channel].put("LOAD:" + str(data["weight"]))
|
|
|
|
elif data["command"] == "ADD":
|
|
|
|
new_item: Dict[str, any] = {
|
|
|
|
"channel_weight": int(data["weight"]),
|
|
|
|
"filename": "dev\\test.mp3",
|
|
|
|
"title": data["title"],
|
|
|
|
"artist": None
|
|
|
|
}
|
|
|
|
channel_to_q[channel].put("ADD:" + json.dumps(new_item))
|
|
|
|
|
|
|
|
await asyncio.wait([conn.send(message) for conn in baps_clients])
|
2020-11-15 17:40:18 +00:00
|
|
|
|
|
|
|
except websockets.exceptions.ConnectionClosedError:
|
|
|
|
print("RIP {}".format(websocket))
|
|
|
|
|
|
|
|
except Exception as e:
|
2020-11-15 19:34:13 +00:00
|
|
|
print("Exception", e)
|
2020-11-15 17:40:18 +00:00
|
|
|
|
|
|
|
finally:
|
|
|
|
baps_clients.remove(websocket)
|
|
|
|
|
|
|
|
|
|
|
|
class WebsocketServer:
|
|
|
|
|
|
|
|
def __init__(self, in_q, state):
|
|
|
|
global channel_to_q
|
|
|
|
channel_to_q = in_q
|
|
|
|
|
2020-11-15 17:48:05 +00:00
|
|
|
global server_name
|
|
|
|
server_name = state.state["server_name"]
|
|
|
|
|
2020-11-15 17:40:18 +00:00
|
|
|
websocket_server = websockets.serve(websocket_handler, state.state["host"], state.state["ws_port"])
|
|
|
|
|
|
|
|
asyncio.get_event_loop().run_until_complete(websocket_server)
|
|
|
|
asyncio.get_event_loop().run_forever()
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
print("Don't do this")
|