Personal noctalia plugins collection
at d15cb4a81370f28a6f803e856898247e5b77ce23 78 lines 2.9 kB view raw
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()