diff --git a/lektor/lektordata/scripts/calendar-fetcher.py b/lektor/lektordata/scripts/calendar-fetcher.py index 0baa8ec..dc27858 100644 --- a/lektor/lektordata/scripts/calendar-fetcher.py +++ b/lektor/lektordata/scripts/calendar-fetcher.py @@ -1,20 +1,70 @@ -from datetime import datetime, date +from datetime import datetime, date, timedelta import recurring_ical_events import requests -from icalendar import Calendar +from copy import deepcopy +from icalendar import Calendar, Event import locale import sys + +def split_multiday_events(events): + """ + Split multi-day events into separate daily events. + + Args: + events: Iterator of iCal events + + Returns: + List of events where multi-day events are split into daily events + """ + split_events = [] + + for event in events: + # Get start and end dates + start = event.get('dtstart').dt + end = event.get('dtend').dt if event.get('dtend') else start + + # Convert datetime to date if needed + if isinstance(start, datetime): + start = start.date() + if isinstance(end, datetime): + end = end.date() + + # If it's a single day event or not a date/datetime, add as is + if not isinstance(start, date) or not isinstance(end, date) or start == end: + split_events.append(event) + continue + + # For multi-day events, create separate events for each day + current_date = start + while current_date < end: + # Create a copy of the original event + daily_event = Event() + for key in event: + daily_event[key] = deepcopy(event[key]) + + + # Update the date for this instance + daily_event['dtstart'].dt = current_date + + if 'dtend' in daily_event: + daily_event['dtend'].dt = current_date + timedelta(days=1) + + split_events.append(daily_event) + current_date += timedelta(days=1) + return split_events + + + def fetch_upcoming_events(ics_url): # Set German locale locale.setlocale(locale.LC_TIME, 'de_DE.UTF-8') response = requests.get(ics_url) calendar = Calendar.from_ical(response.content) - - # Get recurring and non-recurring events - events = recurring_ical_events.of(calendar).after(datetime.now()) - + + events = split_multiday_events(recurring_ical_events.of(calendar).after(datetime.now())) + for event in events: start = event.get('dtstart').dt out_summary = event.get('summary')