Personal noctalia plugins collection
1#!/usr/bin/env python3
2"""Create a calendar event via Evolution Data Server (EDS)."""
3
4import argparse
5import json
6import os
7import sys
8from datetime import datetime, timezone
9
10import gi
11gi.require_version("ECal", "2.0")
12gi.require_version("EDataServer", "1.2")
13gi.require_version("ICalGLib", "3.0")
14from gi.repository import ECal, EDataServer, ICalGLib
15
16
17def find_source(registry, calendar_uid):
18 source = registry.ref_source(calendar_uid)
19 if source and source.has_extension(EDataServer.SOURCE_EXTENSION_CALENDAR):
20 return source
21 # Fallback: search by display name
22 for src in registry.list_sources(EDataServer.SOURCE_EXTENSION_CALENDAR):
23 if src.get_display_name() == calendar_uid or src.get_uid() == calendar_uid:
24 return src
25 return None
26
27
28def make_ical_datetime(timestamp):
29 dt = datetime.fromtimestamp(timestamp, tz=timezone.utc).astimezone()
30 ical_time = ICalGLib.Time.new_null_time()
31 ical_time.set_date(dt.year, dt.month, dt.day)
32 ical_time.set_time(dt.hour, dt.minute, dt.second)
33 tz_name = os.path.realpath("/etc/localtime").split("/zoneinfo/")[1]
34 ical_time.set_timezone(ICalGLib.Timezone.get_builtin_timezone(tz_name))
35 return ical_time
36
37
38def main():
39 parser = argparse.ArgumentParser(description="Create EDS calendar event")
40 parser.add_argument("--calendar", required=True, help="Calendar UID or display name")
41 parser.add_argument("--summary", required=True, help="Event summary/title")
42 parser.add_argument("--start", required=True, type=int, help="Start time (UNIX timestamp)")
43 parser.add_argument("--end", required=True, type=int, help="End time (UNIX timestamp)")
44 parser.add_argument("--location", default="", help="Event location")
45 parser.add_argument("--description", default="", help="Event description")
46 args = parser.parse_args()
47
48 try:
49 registry = EDataServer.SourceRegistry.new_sync(None)
50 source = find_source(registry, args.calendar)
51 if not source:
52 print(json.dumps({"success": False, "error": f"Calendar not found: {args.calendar}"}))
53 sys.exit(1)
54
55 client = ECal.Client.connect_sync(
56 source, ECal.ClientSourceType.EVENTS, 1, None
57 )
58
59 comp = ICalGLib.Component.new(ICalGLib.ComponentKind.VEVENT_COMPONENT)
60 comp.set_summary(args.summary)
61 comp.set_dtstart(make_ical_datetime(args.start))
62 comp.set_dtend(make_ical_datetime(args.end))
63
64 if args.location:
65 comp.set_location(args.location)
66 if args.description:
67 comp.set_description(args.description)
68
69 uid = client.create_object_sync(comp, ECal.OperationFlags.NONE, None)
70 print(json.dumps({"success": True, "uid": uid}))
71
72 except Exception as e:
73 print(json.dumps({"success": False, "error": str(e)}))
74 sys.exit(1)
75
76
77if __name__ == "__main__":
78 main()