88 lines
3.1 KiB
Python
Executable File
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}")
|