Files
bitcoin/generate_ics.py
2026-08-26 15:26:49 +07:00

85 lines
5.5 KiB
Python

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}")