From 1b26964eedb5c220aee9c419b485ace35bb659b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=AE=D1=80=D0=B8=D0=B9=20=D0=A7=D0=B5=D1=80=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=BA=D0=BE?= Date: Tue, 18 Nov 2025 13:52:27 +0300 Subject: [PATCH] test4 --- get_data.py | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/get_data.py b/get_data.py index 54880cb..168ed58 100644 --- a/get_data.py +++ b/get_data.py @@ -155,6 +155,8 @@ PRELOAD_LOCK = False # когда True — consumer будет принимат PRELOADED_GAME_ID = None # ID матча, который мы держим «тёплым» PRELOAD_HOLD_UNTIL = None # timestamp, до какого момента держим (T-1:15) +# 🔥 кэш картинок в оперативной памяти +SHOTMAP_CACHE: dict[str, bytes] = {} # общая очередь results_q = queue.Queue() @@ -1409,6 +1411,14 @@ app = FastAPI( # раздаём /shotmaps как статику из SHOTMAP_DIR app.mount("/shotmaps", StaticFiles(directory=SHOTMAP_DIR), name="shotmaps") +@app.get("/shotmaps/{filename}") +async def get_shotmap(filename: str): + data = SHOTMAP_CACHE.get(filename) + if not data: + # если вдруг перезапустился процесс или такой карты нет + raise HTTPException(status_code=404, detail="Shotmap not found") + return Response(content=data, media_type="image/png") + def format_time(seconds: float | int) -> str: """ Удобный формат времени для игроков: @@ -3460,16 +3470,30 @@ def get_image(points, bib, count_point): # текст draw.text((text_x, text_y), label, font=font, fill=(255, 255, 255, 255)) + # --- сохраняем картинку в оперативную память --- filename = f"shots_{bib}_{count_point}.png" - path = os.path.join(SHOTMAP_DIR, filename) + from io import BytesIO + buf = BytesIO() try: - base_image.save(path, "PNG") + # compress_level=1 — быстрее, чем дефолт + base_image.save(buf, format="PNG", compress_level=1) except Exception as e: - logger.warning(f"[shotmap] не удалось сохранить {path}: {e}") + logger.warning(f"[shotmap] не удалось сохранить shotmap в память: {e}") return "" - return f"https://{MYHOST}.tvstart.ru{path.replace('/root/RFB', '')}" + data = buf.getvalue() + SHOTMAP_CACHE[filename] = data # кладём в RAM + + # формируем URL для vMix + public_base = f"https://{MYHOST}.tvstart.ru" + public_url = f"{public_base.rstrip('/')}/shotmaps/{filename}" + + logger.info( + f"[shotmap] generated in-memory shotmap for bib={bib}, ver={count_point} " + f"-> {filename}, url={public_url}" + ) + return public_url if __name__ == "__main__":