From aeafdc98870793c64bdc143864dcdedae99ba59c 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: Thu, 2 Jul 2026 17:42:48 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D1=8B=D0=B9=20=D1=84=D0=B0?= =?UTF-8?q?=D0=B9=D0=BB=20=D0=B4=D0=BB=D1=8F=20=D1=81=D0=BA=D1=80=D0=B8?= =?UTF-8?q?=D0=BF=D1=82=D0=B0=20=D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.py | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/app.py b/app.py index 8558427..44ececf 100644 --- a/app.py +++ b/app.py @@ -14,6 +14,7 @@ from fastapi.responses import ( JSONResponse, RedirectResponse, StreamingResponse, + PlainTextResponse, ) from fastapi.templating import Jinja2Templates from fastapi.staticfiles import StaticFiles @@ -2011,6 +2012,49 @@ def vmix_match_events(session_token: str): return new_events +def _build_goal_authors_text(match_id: int) -> str: + """Возвращает авторов голов в 2 строки для текстового Data Source vMix. + + 1-я строка — голы первой команды, 2-я строка — голы второй команды. + Авторы внутри строки разделяются символом |. + """ + events = get_vmix_players_goal(match_id) + + home_authors = [] + away_authors = [] + + for home_goal, away_goal in events: + home_goal = (home_goal or "").strip() + away_goal = (away_goal or "").strip() + + if home_goal: + home_authors.append(home_goal) + if away_goal: + away_authors.append(away_goal) + + return "|".join(home_authors) + "\n" + "|".join(away_authors) + + +@app.get("/vmix/session/{session_token}/goal-authors.txt", response_class=PlainTextResponse) +def vmix_goal_authors_txt(session_token: str): + session_row = get_match_session_by_token(session_token) + if not session_row: + return PlainTextResponse("session_not_found", status_code=404) + + text = _build_goal_authors_text(session_row[1]) + return PlainTextResponse( + text, + media_type="text/plain; charset=utf-8", + headers={ + "Cache-Control": "no-store, no-cache, must-revalidate, max-age=0", + "Pragma": "no-cache", + }, + ) + + +@app.get("/vmix/session/{session_token}/goal-authors", response_class=PlainTextResponse) +def vmix_goal_authors_text(session_token: str): + return vmix_goal_authors_txt(session_token) @app.get("/vmix/session/{session_token}/penalties")