import json from datetime import datetime, timedelta import pytz # pip install icalendar from icalendar import Calendar, Event def create_ical_event(date, event): cal = Calendar() ical_event = Event() # The raw event time is in the format "9:30 AM" # We need to convert it to a datetime object event_time = datetime.strptime(event["time"], "%I:%M %p") # "datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]]) event_datetime = datetime( year=date.year, month=date.month, day=date.day, hour=event_time.hour, minute=event_time.minute, tzinfo=date.tzinfo, ) _title = event["title"] if event["title"] else "Untitled" _description = event["description"] if event["description"] else "No description" _where = event["where"] if event["where"] else "No location" ical_event.add("summary", _title) ical_event.add("dtstart", event_datetime) ical_event.add("description", _description) ical_event.add("location", _where) cal.add_component(ical_event) # Max file name length probably changes by OS/FS so be conservative and truncate at 100 char dt_format = "%Y-%m-%dT%H:%M:%S" _file_name_date = event_datetime.strftime(dt_format) filename = f"{_file_name_date}_{_title}.ical".replace(" ", "_") with open(filename, "wb") as f: f.write(cal.to_ical()) print(f"Created iCal file: {filename}") def main(input_json_file): with open(input_json_file, "r") as json_file: schedule = json.load(json_file) event_tz = pytz.timezone("America/Los_Angeles") event_start = event_tz.localize(datetime(year=2024, month=6, day=14)) print(f"Event starts at {event_start}") date_mapping = { "friday": event_start, "saturday": event_start + timedelta(days=1), "sunday": event_start + timedelta(days=2), } print(f"Date mapping: {date_mapping}") for day, events in schedule.items(): if day in date_mapping: date = date_mapping[day] for event in events: create_ical_event(date, event) if __name__ == "__main__": input_json_file = "schedule.json" main(input_json_file)