Files
events-plus/toical.py
T
2025-04-06 19:06:42 -07:00

88 lines
3.1 KiB
Python
Executable File

import requests
from icalendar import Calendar, Event
from datetime import datetime
from collections import defaultdict
# Send multiple POST requests to fetch schedule data
url = "https://www.eventeny.com/funcs/event/event-page-elements-2022-03-06.php"
base_form_data = {
"post_type": "fetch_schedule_list",
"biz_id": "233997",
"event_id": "13462",
"tag_filter": "",
"track_filter": "50949|50946|50955|50947|50954|50950|53643|53642|50956|50948",
"embed": "1"
}
# why are the values here stupid and arbitrary? why does only the first request use date_group_setup 0?
# why do we send three requests when the time limits for the first clearly span the whole event?
# what are they hiding? who the hell knows? i just scraped it off the sakuracon site
requests_data = [
{**base_form_data, "date_group_setup": "0", "time_limit_min": "1744948800", "time_limit_max": "1745207999"},
{**base_form_data, "date_group_setup": "1", "time_limit_min": "1745035200", "time_limit_max": "1745121599"},
{**base_form_data, "date_group_setup": "1", "time_limit_min": "1745121600", "time_limit_max": "1745207999"}
]
all_events = []
all_tracks = {}
for form_data in requests_data:
response = requests.post(url, data=form_data)
response.raise_for_status()
data = response.json()
all_events.extend(data['list'])
all_tracks.update(data['track'])
# Group events by track_title
calendars = defaultdict(Calendar)
for event in all_events:
track_id = event.get("tag_id")
track_title = all_tracks.get(track_id)
cal = calendars[track_title]
# Initialize calendar if empty
if not cal.get("prodid"):
cal.add("prodid", f"-//{track_title} Schedule - SC//")
cal.add("version", "2.0")
cal.add("X-WR-CALNAME", track_title)
# Retrieve description for event
form_data = {
"post_type": "fetch_schedule_item",
"biz_id": "233997",
"event_id": "13462",
"ticket_cross_sell": "no",
"id": event["id"],
}
response = requests.post(url, data=form_data)
response.raise_for_status()
data = response.json()
desc = data["schedule"]["overview"]["description"]
tags_str = ""
# Create event
ical_event = Event()
ical_event.add("summary", event['title'])
ical_event.add("dtstart", datetime.fromisoformat(event['start_calendar']))
ical_event.add("dtend", datetime.fromisoformat(event['end_calendar']))
ical_event.add("location", event['location'].replace('&', '&'))
ical_event.add("status", event['status'].upper())
# Add hashtags as categories if available
if 'hashtag_title' in event and event['hashtag_title']:
ical_event.add('categories', event['hashtag_title'])
tags_str = f"Tags: {','.join(event['hashtag_title'])}\n"
ical_event.add("description", f"Track: {track_title}\n{tags_str}\n{desc}")
cal.add_component(ical_event)
# Write out each calendar to a .ics file
for track_title, cal in calendars.items():
filename = f"calendar_{track_title.replace(' ', '_')}.ics"
with open(filename, 'wb') as f:
f.write(cal.to_ical())
print(f"Wrote: {filename}")