MLB 종료 판정을 detailedState→abstractGameState 기준으로 수정

우천 조기종료(detailedState="Completed Early") 등 "Final" 이외의 종료
변형 문자열은 감지되지 못해 해당 경기가 영원히 정산 안 된 채 live 로
고착되는 버그였다(MLB_PHI_BAL_20260803, 8:0 조기종료 확정임에도 누락).
abstractGameState(Preview/Live/Final 세 값만 존재)로 판정 기준 교체.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
jwkim 2026-08-27 15:09:05 +09:00
parent 11dd968ced
commit bc333d64f4

View File

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