WS server template

This commit is contained in:
DarkCat09 2024-05-02 17:18:27 +04:00
parent 464b65232b
commit 26312a655b
Signed by: DarkCat09
GPG key ID: 0A26CD5B3345D6E3
2 changed files with 83 additions and 0 deletions

61
backend/main.py Normal file
View file

@ -0,0 +1,61 @@
import asyncio
import json
from typing import Any
import secrets
import time
import websockets
import response
# TODO: config
HOST = '127.0.0.1'
PORT = 5678
# TODO: make dict with functions creating YoutubeDL for each site instead of this set
SITES = {'youtube', 'yandex'}
sessions = {}
def generate_key() -> str:
return hex(time.time_ns()) + secrets.token_hex(2)
async def handler(socket: websockets.WebSocketServerProtocol) -> None:
data = json.loads(await socket.recv())
if 'action' not in data:
await socket.send(response.error_field('action'))
return
match data['action']:
case 'init': # create session
if data.get('site') not in SITES:
await socket.send(response.error_field('site'))
return
key = generate_key()
sessions[key] = "" # TODO
await socket.send(response.ok_init(key))
case 'list': # list tracks in album
if 'url' not in data:
await socket.send(response.error_field('url'))
return
await socket.send(response.ok_playlist(['title 1', 'title 2'])) # TODO
case 'download': # download by URL
if 'url' not in data:
await socket.send(response.error_field('url'))
return
# TODO: pass command to the thread started in `init`
await socket.send(response.OK)
case _:
await socket.send(response.error_field('action'))
async def main() -> None:
async with websockets.serve(handler, HOST, PORT):
await asyncio.Future()
if __name__ == '__main__':
asyncio.run(main())

22
backend/response.py Normal file
View file

@ -0,0 +1,22 @@
import json
OK = '{"ok":true}'
def ok_init(key: str) -> str:
return json.dumps({
"ok": True,
"data": key,
})
def ok_playlist(items: list[str]) -> str:
return json.dumps({
"ok": True,
"data": items,
})
def error_field(field: str) -> str:
return json.dumps({
"ok": False,
"error": "field",
"data": field,
})