diff --git a/plugins/httppost.py b/plugins/httppost.py new file mode 100644 index 0000000..3884758 --- /dev/null +++ b/plugins/httppost.py @@ -0,0 +1,9 @@ +import requests +target="HTTP://192.168.1.10:58091/items/" +def httppost(data,url=target): + global log + # 发起请求, + with requests.post(url,json=data, timeout=5) as response: # 增加超时以避免长时间挂起 + response.raise_for_status() # 如果响应不是200,引发HTTPError异常 + log.info(f"httppost url:{url} data :{data} response:{response.text}") + diff --git a/pyproject.toml b/pyproject.toml index fb3c0bc..c1ba415 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -22,6 +22,7 @@ dependencies = [ "python-multipart>=0.0.12", "requests>=2.32.3", "sentry-sdk[fastapi]==1.45.1", + "python-socketio>=5.12.1", ] requires-python = ">=3.10" readme = "README.md" diff --git a/xiaomusic/cli.py b/xiaomusic/cli.py index dcddb66..7ddf4d7 100644 --- a/xiaomusic/cli.py +++ b/xiaomusic/cli.py @@ -40,7 +40,7 @@ def main(): from xiaomusic import __version__ from xiaomusic.config import Config from xiaomusic.httpserver import HttpInit - from xiaomusic.httpserver import app as HttpApp + from xiaomusic.httpserver import socketio_app as HttpApp from xiaomusic.xiaomusic import XiaoMusic parser = argparse.ArgumentParser() diff --git a/xiaomusic/httpserver.py b/xiaomusic/httpserver.py index 4257cf7..e877541 100644 --- a/xiaomusic/httpserver.py +++ b/xiaomusic/httpserver.py @@ -9,7 +9,7 @@ import urllib.parse from contextlib import asynccontextmanager from dataclasses import asdict from typing import TYPE_CHECKING, Annotated - +import socketio if TYPE_CHECKING: from xiaomusic.xiaomusic import XiaoMusic @@ -55,7 +55,13 @@ from xiaomusic.utils import ( xiaomusic: "XiaoMusic" = None config = None log = None - +from pydantic import BaseModel +# 3thplay指令 +class Item(BaseModel): + action:str + args:str +# 在线用户 +onlines= set() @asynccontextmanager async def app_lifespan(app): @@ -104,6 +110,42 @@ app = FastAPI( openapi_url=None, ) +# 创建Socket.IO实例 +sio = socketio.AsyncServer( + async_mode='asgi', + cors_allowed_origins='*' # 允许所有跨域请求,生产环境应限制 +) +# 将Socket.IO挂载到FastAPI应用 +socketio_app = socketio.ASGIApp( + socketio_server=sio, + other_asgi_app=app, + socketio_path='/socket.io' +) + +# Socket.IO事件处理 +@sio.event +async def connect(sid, environ, auth): + global onlines + print(f'客户端连接: {sid}') + onlines.update([sid]) + await sio.emit('message', {'data': '欢迎连接'}, room=sid) + +@sio.event +async def disconnect(sid): + print(f'客户端断开: {sid}') + onlines.discard(sid) + +@sio.on("message") +async def custom_event(sid, data): + log.info(f'收到来自 {sid} 的数据: {data}') + await sio.emit('response', {"action":'切歌','status':data}) + +@app.post("/items/") +async def create_item(item: Item): + result = {**item.dict()} + await sio.emit('response',{"action":item.action,"args":item.args,"status":item.args},) + return onlines + app.add_middleware( CORSMiddleware, allow_origins=["*"], # 允许访问的源 @@ -135,11 +177,11 @@ class AuthStaticFiles(StaticFiles): def HttpInit(_xiaomusic): - global xiaomusic, config, log + global xiaomusic, config, log,onlines xiaomusic = _xiaomusic config = xiaomusic.config log = xiaomusic.log - + onlines=set() folder = os.path.dirname(__file__) app.mount("/static", AuthStaticFiles(directory=f"{folder}/static"), name="static") reset_http_server() diff --git a/xiaomusic/static/3thdplay.mp3 b/xiaomusic/static/3thdplay.mp3 new file mode 100644 index 0000000..fff4e2f Binary files /dev/null and b/xiaomusic/static/3thdplay.mp3 differ diff --git a/xiaomusic/static/3thplay.html b/xiaomusic/static/3thplay.html new file mode 100644 index 0000000..16f35cd --- /dev/null +++ b/xiaomusic/static/3thplay.html @@ -0,0 +1,499 @@ + + +
+ + + + +Avril Lavigne
+