from fastapi import FastAPI, UploadFile from fastapi.responses import HTMLResponse from fastapi.staticfiles import StaticFiles import cv2 import os import numpy as np import uvicorn app = FastAPI() FRAME_FOLDER = "frames" MAP_W = 3 MAP_H = 2 ADMIN_KEY = "supersecret123" os.makedirs(FRAME_FOLDER, exist_ok=True) app.mount("/frames", StaticFiles(directory="frames"), name="frames") current_streamer = None @app.get("/", response_class=HTMLResponse) def home(nick: str = "Unknown"): return f"""

Вы: {nick}

Текущий стример: None

""" @app.get("/status") def status(): return {"streamer": current_streamer} @app.get("/start") def start(nick: str): global current_streamer if current_streamer is not None: return {"error": "Кто-то уже стримит!"} current_streamer = nick return {"ok": True} @app.get("/stop") def stop(nick: str): global current_streamer if current_streamer == nick: current_streamer = None return {"ok": True} @app.post("/frame_upload") async def frame_upload(file: UploadFile): data = await file.read() nparr = np.frombuffer(data, np.uint8) frame = cv2.imdecode(nparr, cv2.IMREAD_COLOR) frame = cv2.resize(frame, (MAP_W*128, MAP_H*128)) for y in range(MAP_H): for x in range(MAP_W): tile = frame[ y*128:(y+1)*128, x*128:(x+1)*128 ] map_id = y*MAP_W + x path = f"{FRAME_FOLDER}/map{map_id}.jpg" cv2.imwrite(path, tile) return {"ok": True} @app.get("/force_stop") def force_stop(key: str): global current_streamer if key != ADMIN_KEY: return {"error": "access denied"} current_streamer = None return {"status": "stream force stopped"} if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=7860)