Adds meetup event data fetching and conversion

Adds functionality to fetch event data from Meetup's API, convert it to JSON, and then create markdown posts for a website.
The script now fetches event details using the Meetup API or retrieves them from existing JSON files, enhancing data management and content generation.
This commit is contained in:
fundor333
2025-09-30 02:12:12 +02:00
parent c782cce489
commit 1517cab45a
17 changed files with 571 additions and 21 deletions

View File

@@ -4,7 +4,7 @@ import os
import re
import typer
from typing import Annotated
import json
url = "https://api.meetup.com/gql-ext"
@@ -38,19 +38,41 @@ query = """query($eventId: ID!) {
}"""
def serialize_datetime(obj):
if isinstance(obj, datetime.datetime):
return obj.strftime("%Y-%m-%d %H:%M:%S")
raise TypeError("Type not serializable")
def fetch_event(event_id):
variables = {"eventId": event_id}
r = requests.post(url, json={"query": query, "variables": variables})
return r.json()
data = r.json()
data["id"] = event_id
data["now"] = (
datetime.datetime.now(datetime.UTC) - datetime.timedelta(days=36500)
).strftime("%Y-%m-%dT%H:%M:%S")
return data
def convert_json_to_post(data):
def convert_dict_to_json(data):
# convert the json to a pretty json and save it in data/event/event_id.json
os.makedirs("data/event", exist_ok=True)
event = data["data"]["event"]
event_id = re.search(r"events/(\d+)", event["eventUrl"]).group(1)
filename = f"data/event/{event_id}.json"
with open(filename, "w") as f:
json.dump(data, f, indent=4, sort_keys=True, default=serialize_datetime)
def convert_dict_to_post(data):
# convert the json to a markdown post following the format in content/event
now = datetime.datetime.now(datetime.UTC) - datetime.timedelta(days=36500)
now = data["now"]
event = data["data"]["event"]
title = event["title"]
date_time_file = datetime.datetime.fromisoformat(
event["dateTime"].replace("Z", "")
).strftime("%Y-%m-%d")
description = event["description"]
date_time = datetime.datetime.fromisoformat(event["dateTime"].replace("Z", ""))
end_time = datetime.datetime.fromisoformat(event["endTime"].replace("Z", ""))
@@ -63,8 +85,8 @@ def convert_json_to_post(data):
tags = [f"meetup-{topic}" for topic in topics]
tags_str = ", ".join(tags)
date_str = date_time.strftime("%Y-%m-%d %H:%M:%S")
end_date_str = end_time.strftime("%Y-%m-%d %H:%M:%S")
date_str = date_time
end_date_str = end_time
venue_str = ""
if len(venues) > 1:
venue = venues[0]
@@ -74,7 +96,7 @@ def convert_json_to_post(data):
post = f"""---
title: {title!r}
date: {now.strftime('%Y-%m-%dT%H:%M:%S')}
date: {now}
start: {date_str}
end: {end_date_str}
location: {venue_str}
@@ -90,7 +112,7 @@ how_to_find_us: {how_to_find_us}
os.makedirs("content/event", exist_ok=True)
# write to a markdown file where is in the format content/event/YYYY-MM-DD-event-title.md
filename = f"content/event/{date_time.strftime('%Y-%m-%d')}-{re.sub(r'[^a-zA-Z0-9]+', '-', title).strip('-').lower()}.md"
filename = f"content/event/{date_time_file}-{re.sub(r'[^a-zA-Z0-9]+', '-', title).strip('-').lower()}.md"
with open(filename, "w") as f:
f.write(post)
@@ -113,6 +135,18 @@ def add_to_memory(text: str):
print(f"{text} is already in memory.")
def fetch_event_from_json(event_id):
filename = f"data/event/{event_id}.json"
if not os.path.exists(filename):
print(
f"No JSON file found for event ID {event_id}. Please fetch the event first."
)
return None
with open(filename) as f:
data = json.load(f)
return data
def main(
text: Annotated[str, typer.Argument()] = None,
memory: Annotated[bool, typer.Option("--memory", "-m")] = False,
@@ -123,19 +157,22 @@ def main(
memory = f.read().splitlines()
for item in memory:
print(f"Fetching event {item} from memory...")
data = fetch_event(item)
convert_json_to_post(data)
data = fetch_event_from_json(item)
convert_dict_to_post(data)
else:
print("No memory file found.")
return
if text is None:
text = input("Give me a Meetup event URL or ID: ")
match = re.search(r"meetup.com/.+?/events/(\d+)", text)
if match:
text = match.group(1)
add_to_memory(text)
data = fetch_event(text)
convert_json_to_post(data)
else:
if text is None:
text = input("Give me a Meetup event URL or ID: ")
match = re.search(r"meetup.com/.+?/events/(\d+)", text)
if match:
text = match.group(1)
add_to_memory(text)
data = fetch_event(text)
convert_dict_to_json(data)
data = fetch_event_from_json(item)
convert_dict_to_post(data)
if __name__ == "__main__":