test4
This commit is contained in:
32
get_data.py
32
get_data.py
@@ -155,6 +155,8 @@ PRELOAD_LOCK = False # когда True — consumer будет принимат
|
|||||||
PRELOADED_GAME_ID = None # ID матча, который мы держим «тёплым»
|
PRELOADED_GAME_ID = None # ID матча, который мы держим «тёплым»
|
||||||
PRELOAD_HOLD_UNTIL = None # timestamp, до какого момента держим (T-1:15)
|
PRELOAD_HOLD_UNTIL = None # timestamp, до какого момента держим (T-1:15)
|
||||||
|
|
||||||
|
# 🔥 кэш картинок в оперативной памяти
|
||||||
|
SHOTMAP_CACHE: dict[str, bytes] = {}
|
||||||
|
|
||||||
# общая очередь
|
# общая очередь
|
||||||
results_q = queue.Queue()
|
results_q = queue.Queue()
|
||||||
@@ -1409,6 +1411,14 @@ app = FastAPI(
|
|||||||
# раздаём /shotmaps как статику из SHOTMAP_DIR
|
# раздаём /shotmaps как статику из SHOTMAP_DIR
|
||||||
app.mount("/shotmaps", StaticFiles(directory=SHOTMAP_DIR), name="shotmaps")
|
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:
|
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))
|
draw.text((text_x, text_y), label, font=font, fill=(255, 255, 255, 255))
|
||||||
|
|
||||||
|
# --- сохраняем картинку в оперативную память ---
|
||||||
filename = f"shots_{bib}_{count_point}.png"
|
filename = f"shots_{bib}_{count_point}.png"
|
||||||
path = os.path.join(SHOTMAP_DIR, filename)
|
|
||||||
|
|
||||||
|
from io import BytesIO
|
||||||
|
buf = BytesIO()
|
||||||
try:
|
try:
|
||||||
base_image.save(path, "PNG")
|
# compress_level=1 — быстрее, чем дефолт
|
||||||
|
base_image.save(buf, format="PNG", compress_level=1)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.warning(f"[shotmap] не удалось сохранить {path}: {e}")
|
logger.warning(f"[shotmap] не удалось сохранить shotmap в память: {e}")
|
||||||
return ""
|
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__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
Reference in New Issue
Block a user