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:
@@ -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__":
|
||||
|
||||
Reference in New Issue
Block a user