94 lines
3.3 KiB
Python
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}")
|