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)