Initial Commit
This commit is contained in:
93
data/get_standings.py
Normal file
93
data/get_standings.py
Normal file
@@ -0,0 +1,93 @@
|
||||
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}")
|
||||
Reference in New Issue
Block a user