from datetime import datetime import json import httpx import xmltodict async def get_msreg(track): base_url = "https://api.motorsportreg.com/rest/calendars/organization" orgs = { "speeddistrict": "2E22740B-E8C9-9FB9-21406A496429A28B", "ongrid": "06277C99-00C9-23EB-FD08FE5275BCC0C5", "speedsf": "072A885E-AD68-6F64-E88C19E4D0D21DFB", "turn8": "F3469266-BEFF-E329-4FD6C4B189ACE2A8", "speedventures": "DF7453ED-BF33-DC17-2C9BFD84C1F05E86", "nextlevel": "CC23AEA4-AAB1-D087-4A10818D229DAFD2", "lightspeed": "BC6417B8-0ED9-DD48-28BA1463C2C14322", "socaldriversclub": "B4FC0113-C903-E9D3-68562D6765806945", } events = {} client = httpx.AsyncClient() if track == "Both": tracks_we_care_about = ["buttonwillow", "thunderhill"] else: tracks_we_care_about = [track.lower()] for org_name, org_id in orgs.items(): xml_blob = await client.get( "%s/%s?exclude_cancelled=true&postalcode=94549&radius=500" % (base_url, org_id) ) awaited_xml_blob = xml_blob.text json_blob = json.loads( json.dumps(xmltodict.parse(awaited_xml_blob)["response"]["events"]) ) # If an organizer only has one upcoming event on MSReg, it is a dict, otherwise its a list of dicts # My code assumes list of dicts, so wrap the event dict in a list of 1 item if json_blob and isinstance(json_blob["event"], dict): json_blob["event"] = [json_blob["event"]] try: for event in json_blob["event"]: if any(x in event["name"].lower() for x in tracks_we_care_about): event_object = { "event_organizer": event["organization"]["name"], "event_name": event["name"], "event_url": event["detailuri"].split("?utm")[0], "event_date": event["start"], } track = event["venue"]["name"] if track not in events: events[track] = [] events[track].append(event_object) for track, track_events in events.items(): events[track] = sorted( track_events, key=lambda event: datetime.fromisoformat( event["event_date"] ), ) except Exception as e: print("Errored on %s" % org_name) print(e) pass return events def get_corsa_club(): base_url = "https://corsa.club" events = {} products_blob = requests.get(base_url + "/products.json").json()["products"] for event in products_blob: # Filter out hoodies and what not, only care about track days that list run-groups as the options if any("Intermediate" in s for s in event["options"][0]["values"]): event_object = { "event_name": event["title"], "event_url": base_url + "/products/" + event["handle"], "event_date": event["title"].split()[-1], } track = " ".join(event["title"].split()[0:-1]) try: if track not in events: events[track] = [] events[track].append(event_object) except TypeError: pass return events # if __name__ == '__main__': # get_corsa_club()