"""Free .ics to CSV. Usage: python3 ics_to_csv.py calendar.ics > hours.csv
Handles single timed events. Repeating events show once; times are as written."""
import csv, datetime, re, sys

text = re.sub(r"\r?\n[ \t]", "", open(sys.argv[1], encoding="utf8").read())
out = csv.writer(sys.stdout)
out.writerow(["Start", "End", "Hours", "Event"])
for block in re.findall(r"BEGIN:VEVENT(.*?)END:VEVENT", text, re.S):
    get = lambda name: re.search(rf"^{name}[^:\n]*:(.*)$", block, re.M)
    start, end, title = get("DTSTART"), get("DTEND"), get("SUMMARY")
    if not (start and end) or "T" not in start.group(1):
        continue
    a, b = [datetime.datetime.strptime(m.group(1).strip()[:15], "%Y%m%dT%H%M%S") for m in (start, end)]
    hours = (b - a).total_seconds() / 3600
    out.writerow([a, b, round(hours, 2), title.group(1).strip() if title else ""])
