import csv import os from datetime import datetime, timedelta csv_file = 'data/calendar.csv' ics_file = 'data/calendar.ics' if not os.path.exists(csv_file): print(f"Error: {csv_file} not found. Please ensure your CSV is located at {csv_file}.") exit(1) ics_lines = [ "BEGIN:VCALENDAR", "VERSION:2.0", "PRODID:-//Hermes Agent//Calendar Exporter//DE", "CALSCALE:GREGORIAN", "METHOD:PUBLISH" ] days_map = { "montag": "MO", "dienstag": "TU", "mittwoch": "WE", "donnerstag": "TH", "freitag": "FR", "samstag": "SA", "sonntag": "SU" } with open(csv_file, mode='r', encoding='utf-8') as f: reader = csv.DictReader(f) for row in reader: title = row.get("titel", "Termin") time_str = row.get("zeit", "09:00") rhythm = row.get("wochentag", "").strip().lower() date_str = row.get("datum", "").strip() desc = row.get("beschreibung", "") # Zeit parsen try: hour, minute = map(int, time_str.split(":")) except: hour, minute = 9, 0 uid = f"hermes-{abs(hash(title + time_str + rhythm + date_str))}@local" if rhythm == "täglich": start_dt = datetime.now().replace(hour=hour, minute=minute, second=0, microsecond=0) start_str = start_dt.strftime("%Y%m%dT%H%M%S") end_str = (start_dt + timedelta(hours=1)).strftime("%Y%m%dT%H%M%S") ics_lines.extend([ "BEGIN:VEVENT", f"UID:{uid}", f"DTSTART:{start_str}", f"DTEND:{end_str}", f"SUMMARY:{title}", f"DESCRIPTION:{desc}", "RRULE:FREQ=DAILY", "END:VEVENT" ]) elif rhythm in days_map: start_dt = datetime.now().replace(hour=hour, minute=minute, second=0, microsecond=0) start_str = start_dt.strftime("%Y%m%dT%H%M%S") end_str = (start_dt + timedelta(hours=1)).strftime("%Y%m%dT%H%M%S") byday = days_map[rhythm] ics_lines.extend([ "BEGIN:VEVENT", f"UID:{uid}", f"DTSTART:{start_str}", f"DTEND:{end_str}", f"SUMMARY:{title}", f"DESCRIPTION:{desc}", f"RRULE:FREQ=WEEKLY;BYDAY={byday}", "END:VEVENT" ]) elif date_str: try: dt = datetime.strptime(date_str, "%Y-%m-%d").replace(hour=hour, minute=minute) start_str = dt.strftime("%Y%m%dT%H%M%S") end_str = (dt + timedelta(hours=1)).strftime("%Y%m%dT%H%M%S") ics_lines.extend([ "BEGIN:VEVENT", f"UID:{uid}", f"DTSTART:{start_str}", f"DTEND:{end_str}", f"SUMMARY:{title}", f"DESCRIPTION:{desc}", "END:VEVENT" ]) except Exception as e: print(f"Skipping row due to date parse error: {row} ({e})") ics_lines.append("END:VCALENDAR") with open(ics_file, mode='w', encoding='utf-8') as f: f.write("\n".join(ics_lines)) print(f"Erfolgreich generiert: {ics_file}")