#!/usr/bin/env python3 import sys import logging import locale from dateutil.parser import parse from datetime import datetime, timedelta from dateutil.rrule import rruleset, rrulestr import icalendar def vevent_to_event(event, rrstart=None): if rrstart == None: begin = parse(event["DTSTART"].to_ical()) else: begin = rrstart return { "name": event["SUMMARY"].to_ical(), "url": event["URL"].to_ical(), "begin": begin } def parse_single_event(event, start, end): logging.info(f"Processing single event {event['SUMMARY'].to_ical().decode('utf-8')}") dtstart = parse(event["DTSTART"].to_ical()) if dtstart >= start and dtstart < end: return vevent_to_event(event) def parse_recurring_event(event, start, end): logging.info(f"Processing recurring event {event['SUMMARY'].to_ical().decode('utf-8')}") dtstart = parse(event["DTSTART"].to_ical()) rs = rruleset() rs.rrule(rrulestr(event["RRULE"].to_ical().decode("utf-8"), dtstart=dtstart)) if "EXDATE" in event.keys(): for exdate in event["EXDATE"]: rs.exdate(parse(exdate.to_ical())) events = [] for date in list(rs): if date >= start and date < end: events.append(vevent_to_event(event, date)) return events def find_events(icsfilestr, start, end, num): with open(icsfilestr, "r") as icsfile: cal = icalendar.Calendar.from_ical(icsfile.read()) events = [] for event in cal.subcomponents: if event.name == "VEVENT": if "RRULE" in event.keys(): events.extend(parse_recurring_event(event, start, end)) elif ev := parse_single_event(event, start, end) != None: events.append(ev) events = sorted(events, key=lambda k: k["begin"]) events = events[0:num] return events def format_events(events): print("
{event['begin'].strftime('%A, %d.%m um %H:%M Uhr')} | " f"{event['name'].decode('utf-8')} | " "