Files
EOJHL-LED-Scoreboard/data/get_standings.py
2026-02-13 12:22:06 -05:00

94 lines
3.3 KiB
Python

import requests, json, re, os, shutil, glob
from datetime import datetime
# EOJHL standings feed (JSONP)
STANDINGS_URL = (
"https://lscluster.hockeytech.com/feed/index.php?"
"feed=statviewfeed&view=teams&groupTeamsBy=division&context=overall"
"&site_id=2&season=110&special=false&key=1defb601c9b37c24"
"&client_code=eojhl&league_id=2&conference=-1&division=-1"
"&sort=points&lang=en&callback=angular.callbacks._4"
)
# --- TEAM ABBREVIATION MAP ---
TEAM_ABBR_MAP = {
"Ottawa": "OJC",
"Carleton Place": "CPC",
"Ottawa West": "OTW",
"Richmond": "RCH",
"Casselman": "CAS",
"Smiths Falls": "SFB",
"Embrun": "EMB",
"Perth": "PER",
"Glengarry": "GB",
"Arnprior": "ARP",
"Athens": "ATH",
"Renfrew": "REN",
"Winchester": "WIN"
}
OUTPUT_FILE = "eojhl_standings.json"
MAX_BACKUPS = 2
def backup_file(filename):
"""Backup existing file with timestamp and prune old backups."""
if os.path.exists(filename):
ts = datetime.now().strftime("%Y%m%d-%H%M%S")
backup = f"{filename}.{ts}.bak"
shutil.move(filename, backup)
backups = sorted(glob.glob(f"{filename}.*.bak"), reverse=True)
for old in backups[MAX_BACKUPS:]:
os.remove(old)
print(f"Backed up {filename} -> {backup}")
def fetch_jsonp(url):
"""Fetch JSONP and return parsed JSON (handles arrays or objects)."""
text = requests.get(url).text.strip()
if text.startswith("{") or text.startswith("["):
return json.loads(text)
match = re.search(r'^[^(]+\((.*)\)\s*$', text, re.S)
if match:
return json.loads(match.group(1))
raise ValueError("Response was not valid JSON or JSONP:\n" + text[:200])
def transform_standings(raw):
"""Transform HockeyTech standings into legacy JSON format with records."""
standings = {"martin": [], "richardson": []}
sections = raw[0].get("sections", [])
for section in sections:
headers = section.get("headers", {})
label = headers.get("name", {}).get("properties", {}).get("label", "").lower()
key = "martin" if "martin" in label else "richardson" if "richardson" in label else None
if not key:
continue
for team in section.get("data", []):
row = team.get("row", {})
name = row.get("name", "").strip()
if not name:
continue
abbr = row.get("team_code") or name[:3].upper()
# Extract record fields (keys may vary: wins, losses, ties, ot_losses, shootout_losses)
wins = row.get("wins", "0")
losses = row.get("losses", "0")
ot_losses = row.get("ot_losses") or int("0")
so_losses = row.get("shootout_losses") or int("0")
otlosses = int(ot_losses) + int(so_losses)
record = f"{wins}-{losses}-{otlosses}"
standings[key].append({
"name": name,
"abbreviation": abbr,
"logo": f"assets/sports/eojhl_logos/{abbr}.png",
"record": record
})
return standings
if __name__ == "__main__":
backup_file(OUTPUT_FILE)
raw = fetch_jsonp(STANDINGS_URL)
standings = transform_standings(raw)
with open(OUTPUT_FILE, "w") as f:
json.dump(standings, f, indent=2)
print(f"Standings written to {OUTPUT_FILE}")