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 = { "turn8": "F3469266-BEFF-E329-4FD6C4B189ACE2A8", "speedventures": "DF7453ED-BF33-DC17-2C9BFD84C1F05E86", "speedsf": "072A885E-AD68-6F64-E88C19E4D0D21DFB", "speeddistrict": "2E22740B-E8C9-9FB9-21406A496429A28B", "socaldriversclub": "B4FC0113-C903-E9D3-68562D6765806945", "ongrid": "06277C99-00C9-23EB-FD08FE5275BCC0C5", "nextlevel": "CC23AEA4-AAB1-D087-4A10818D229DAFD2", "lightspeed": "BC6417B8-0ED9-DD48-28BA1463C2C14322", "fast_toys": "F2829F4E-91A1-30B9-919956FB1BE3CFB4", "drive_tracktime": "F8940175-D299-85F5-4BFFE1243A2D0B88", "trackedllc": "22332933-D95D-7DD2-A81CE491A98854D5", } 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"]) ) # prints for debug import pprint pp = pprint.PrettyPrinter(indent=4) # 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["venue"]["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