From bc333d64f4ee8fde75e7fdebfe90199511383b25 Mon Sep 17 00:00:00 2001 From: jwkim Date: Thu, 27 Aug 2026 15:09:05 +0900 Subject: [PATCH] =?UTF-8?q?MLB=20=EC=A2=85=EB=A3=8C=20=ED=8C=90=EC=A0=95?= =?UTF-8?q?=EC=9D=84=20detailedState=E2=86=92abstractGameState=20=EA=B8=B0?= =?UTF-8?q?=EC=A4=80=EC=9C=BC=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 우천 조기종료(detailedState="Completed Early") 등 "Final" 이외의 종료 변형 문자열은 감지되지 못해 해당 경기가 영원히 정산 안 된 채 live 로 고착되는 버그였다(MLB_PHI_BAL_20260803, 8:0 조기종료 확정임에도 누락). abstractGameState(Preview/Live/Final 세 값만 존재)로 판정 기준 교체. Co-Authored-By: Claude Fable 5 --- backend/app/services/baseball_fetch.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/backend/app/services/baseball_fetch.py b/backend/app/services/baseball_fetch.py index 2711aaf..2483529 100644 --- a/backend/app/services/baseball_fetch.py +++ b/backend/app/services/baseball_fetch.py @@ -95,17 +95,24 @@ async def _fetch_mlb(days_back: int, days_ahead: int) -> list[dict]: kickoff = ( datetime.fromisoformat(gd.replace("Z", "+00:00")).astimezone(KST) ) - state = (g.get("status") or {}).get("detailedState", "") + status_obj = g.get("status") or {} + # detailedState 는 "Final"/"Game Over"/"Completed Early"(우천 조기종료) 등 + # 종료를 뜻하는 문자열이 여러 갈래라 그것만으로 판정하면 일부가 누락된다. + # abstractGameState 는 Preview/Live/Final 세 값만 존재하는 신뢰 가능한 판정 기준. + abstract = status_obj.get("abstractGameState", "") + detailed = status_obj.get("detailedState", "") rec = { "league": "mlb", "teamA": a, "teamB": b, "dateKst": kickoff.strftime("%Y%m%d"), "kickoffKst": kickoff.isoformat(), "venue": (g.get("venue") or {}).get("name", ""), - "cancelled": state in ("Postponed", "Cancelled", "Suspended"), + "cancelled": abstract != "Final" and detailed.startswith( + ("Postponed", "Cancelled", "Suspended") + ), "gamePk": g.get("gamePk"), # MLB 라이브 피드 키 } - if state == "Final" and not rec["cancelled"]: + if abstract == "Final" and not rec["cancelled"]: sa = g["teams"]["away"].get("score") sb = g["teams"]["home"].get("score") if sa is not None and sb is not None: