Coverage for icloudpy/services/calendar.py: 20%
44 statements
« prev ^ index » next coverage.py v7.6.10, created at 2024-12-30 19:31 +0000
« prev ^ index » next coverage.py v7.6.10, created at 2024-12-30 19:31 +0000
1"""Calendar service."""
2from calendar import monthrange
3from datetime import datetime
5from tzlocal import get_localzone
8class CalendarService:
9 """
10 The 'Calendar' iCloud service, connects to iCloud and returns events.
11 """
13 def __init__(self, service_root, session, params):
14 self.session = session
15 self.params = params
16 self._service_root = service_root
17 self._calendar_endpoint = f"{self._service_root}/ca"
18 self._calendar_refresh_url = f"{self._calendar_endpoint}/events"
19 self._calendar_event_detail_url = f"{self._calendar_endpoint}/eventdetail"
20 self._calendars = f"{self._calendar_endpoint}/startup"
22 self.response = {}
24 def get_event_detail(self, pguid, guid):
25 """
26 Fetches a single event's details by specifying a pguid
27 (a calendar) and a guid (an event's ID).
28 """
29 params = dict(self.params)
30 params.update(
31 {
32 "lang": "en-us",
33 "usertz": get_localzone().zone,
34 "dsid": self.session.service.data["dsInfo"]["dsid"],
35 },
36 )
37 url = f"{self._calendar_event_detail_url}/{pguid}/{guid}"
38 req = self.session.get(url, params=params)
39 self.response = req.json()
40 return self.response["Event"][0]
42 def refresh_client(self, from_dt=None, to_dt=None):
43 """
44 Refreshes the CalendarService endpoint, ensuring that the
45 event data is up-to-date. If no 'from_dt' or 'to_dt' datetimes
46 have been given, the range becomes this month.
47 """
48 today = datetime.today()
49 _, last_day = monthrange(today.year, today.month)
50 if not from_dt:
51 from_dt = datetime(today.year, today.month, 1)
52 if not to_dt:
53 to_dt = datetime(today.year, today.month, last_day)
54 params = dict(self.params)
55 params.update(
56 {
57 "lang": "en-us",
58 "usertz": get_localzone().zone,
59 "startDate": from_dt.strftime("%Y-%m-%d"),
60 "endDate": to_dt.strftime("%Y-%m-%d"),
61 "dsid": self.session.service.data["dsInfo"]["dsid"],
62 },
63 )
64 req = self.session.get(self._calendar_refresh_url, params=params)
65 self.response = req.json()
67 def events(self, from_dt=None, to_dt=None):
68 """
69 Retrieves events for a given date range, by default, this month.
70 """
71 self.refresh_client(from_dt, to_dt)
72 return self.response.get("Event")
74 def calendars(self):
75 """
76 Retrieves calendars of this month.
77 """
78 today = datetime.today()
79 _, last_day = monthrange(today.year, today.month)
80 from_dt = datetime(today.year, today.month, 1)
81 to_dt = datetime(today.year, today.month, last_day)
82 params = dict(self.params)
83 params.update(
84 {
85 "lang": "en-us",
86 "usertz": get_localzone().zone,
87 "startDate": from_dt.strftime("%Y-%m-%d"),
88 "endDate": to_dt.strftime("%Y-%m-%d"),
89 "dsid": self.session.service.data["dsInfo"]["dsid"],
90 },
91 )
92 req = self.session.get(self._calendars, params=params)
93 self.response = req.json()
94 return self.response["Collection"]