This commit is contained in:
2025-11-18 13:52:27 +03:00
parent c9ab12ab5f
commit 1b26964eed

View File

@@ -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__":