Added basic handling multiday events

This commit is contained in:
Reto 2025-01-09 11:52:53 +00:00
parent f9db71a9c5
commit d3094d8d53

View file

@ -1,20 +1,70 @@
from datetime import datetime, date from datetime import datetime, date, timedelta
import recurring_ical_events import recurring_ical_events
import requests import requests
from icalendar import Calendar from copy import deepcopy
from icalendar import Calendar, Event
import locale import locale
import sys 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): def fetch_upcoming_events(ics_url):
# Set German locale # Set German locale
locale.setlocale(locale.LC_TIME, 'de_DE.UTF-8') locale.setlocale(locale.LC_TIME, 'de_DE.UTF-8')
response = requests.get(ics_url) response = requests.get(ics_url)
calendar = Calendar.from_ical(response.content) calendar = Calendar.from_ical(response.content)
# Get recurring and non-recurring events events = split_multiday_events(recurring_ical_events.of(calendar).after(datetime.now()))
events = recurring_ical_events.of(calendar).after(datetime.now())
for event in events: for event in events:
start = event.get('dtstart').dt start = event.get('dtstart').dt
out_summary = event.get('summary') out_summary = event.get('summary')