Create balfolk_ical.py
Signed-off-by: Kjeld Schouten <info@kjeldschouten.nl>
This commit is contained in:
@@ -0,0 +1,72 @@
|
|||||||
|
import requests
|
||||||
|
from bs4 import BeautifulSoup
|
||||||
|
from datetime import datetime
|
||||||
|
import uuid
|
||||||
|
|
||||||
|
|
||||||
|
def fetch_balfolk_events():
|
||||||
|
url = "https://www.balfolk.nl/agenda/"
|
||||||
|
response = requests.get(url)
|
||||||
|
response.raise_for_status()
|
||||||
|
|
||||||
|
soup = BeautifulSoup(response.text, "html.parser")
|
||||||
|
events = []
|
||||||
|
|
||||||
|
for li in soup.select("ul#response li.flex-container"):
|
||||||
|
date_location = li.select_one(".date")
|
||||||
|
title = li.select_one(".title a")
|
||||||
|
|
||||||
|
if not date_location or not title:
|
||||||
|
continue
|
||||||
|
|
||||||
|
date_loc_text = date_location.text.strip()
|
||||||
|
title_text = title.text.strip()
|
||||||
|
|
||||||
|
try:
|
||||||
|
# "di 12 aug 2025 | Gent" → "12 aug 2025"
|
||||||
|
date_part, location = map(str.strip, date_loc_text.split("|"))
|
||||||
|
date_clean = " ".join(date_part.split(" ")[1:])
|
||||||
|
event_date = datetime.strptime(date_clean, "%d %b %Y")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Skipping: {e} → {date_loc_text}")
|
||||||
|
continue
|
||||||
|
|
||||||
|
events.append({
|
||||||
|
"date": event_date,
|
||||||
|
"name": title_text,
|
||||||
|
"location": location
|
||||||
|
})
|
||||||
|
|
||||||
|
return events
|
||||||
|
|
||||||
|
|
||||||
|
def generate_ical(events):
|
||||||
|
lines = [
|
||||||
|
"BEGIN:VCALENDAR",
|
||||||
|
"VERSION:2.0",
|
||||||
|
"PRODID:-//Balfolk Calendar//EN"
|
||||||
|
]
|
||||||
|
|
||||||
|
for e in events:
|
||||||
|
lines += [
|
||||||
|
"BEGIN:VEVENT",
|
||||||
|
f"UID:{uuid.uuid4()}",
|
||||||
|
f"DTSTAMP:{datetime.utcnow().strftime('%Y%m%dT%H%M%SZ')}",
|
||||||
|
f"DTSTART;VALUE=DATE:{e['date'].strftime('%Y%m%d')}",
|
||||||
|
f"SUMMARY:{e['name']}",
|
||||||
|
f"LOCATION:{e['location']}",
|
||||||
|
"END:VEVENT"
|
||||||
|
]
|
||||||
|
|
||||||
|
lines.append("END:VCALENDAR")
|
||||||
|
return "\n".join(lines)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
events = fetch_balfolk_events()
|
||||||
|
ical = generate_ical(events)
|
||||||
|
|
||||||
|
with open("balfolk.ics", "w", encoding="utf-8") as f:
|
||||||
|
f.write(ical)
|
||||||
|
|
||||||
|
print("✅ Saved calendar as 'balfolk.ics'")
|
||||||
Reference in New Issue
Block a user