Coverage for icloudpy/services/reminders.py: 21%
43 statements
« prev ^ index » next coverage.py v7.6.10, created at 2025-10-25 16:04 +0000
« prev ^ index » next coverage.py v7.6.10, created at 2025-10-25 16:04 +0000
1"""Reminders service."""
3import json
4import time
5import uuid
6from datetime import datetime
8from tzlocal import get_localzone
11class RemindersService:
12 """The 'Reminders' iCloud service."""
14 def __init__(self, service_root, session, params):
15 self.session = session
16 self._params = params
17 self._service_root = service_root
19 self.lists = {}
20 self.collections = {}
22 self.refresh()
24 def refresh(self):
25 """Refresh data."""
26 params_reminders = dict(self._params)
27 params_reminders.update(
28 {
29 "clientVersion": "4.0",
30 "lang": "en-us",
31 "usertz": str(get_localzone()),
32 "dsid": self.session.service.data["dsInfo"]["dsid"],
33 },
34 )
36 # Open reminders
37 req = self.session.get(
38 self._service_root + "/rd/startup",
39 params=params_reminders,
40 )
42 data = req.json()
44 self.lists = {}
45 self.collections = {}
46 for collection in data["Collections"]:
47 temp = []
48 self.collections[collection["title"]] = {
49 "guid": collection["guid"],
50 "ctag": collection["ctag"],
51 }
52 for reminder in data["Reminders"]:
53 if reminder["pGuid"] != collection["guid"]:
54 continue
56 if reminder.get("dueDate"):
57 due = datetime(
58 reminder["dueDate"][1],
59 reminder["dueDate"][2],
60 reminder["dueDate"][3],
61 reminder["dueDate"][4],
62 reminder["dueDate"][5],
63 )
64 else:
65 due = None
67 temp.append(
68 {
69 "title": reminder["title"],
70 "desc": reminder.get("description"),
71 "due": due,
72 },
73 )
74 self.lists[collection["title"]] = temp
76 def post(self, title, description="", collection=None, due_date=None):
77 """Adds a new reminder."""
78 pguid = "tasks"
79 if collection:
80 if collection in self.collections:
81 pguid = self.collections[collection]["guid"]
83 params_reminders = dict(self._params)
84 params_reminders.update(
85 {"clientVersion": "4.0", "lang": "en-us", "usertz": str(get_localzone())},
86 )
88 due_dates = None
89 if due_date:
90 due_dates = [
91 int(str(due_date.year) + str(due_date.month) + str(due_date.day)),
92 due_date.year,
93 due_date.month,
94 due_date.day,
95 due_date.hour,
96 due_date.minute,
97 ]
99 req = self.session.post(
100 self._service_root + "/rd/reminders/tasks",
101 data=json.dumps(
102 {
103 "Reminders": {
104 "title": title,
105 "description": description,
106 "pGuid": pguid,
107 "etag": None,
108 "order": None,
109 "priority": 0,
110 "recurrence": None,
111 "alarms": [],
112 "startDate": None,
113 "startDateTz": None,
114 "startDateIsAllDay": False,
115 "completedDate": None,
116 "dueDate": due_dates,
117 "dueDateIsAllDay": False,
118 "lastModifiedDate": None,
119 "createdDate": None,
120 "isFamily": None,
121 "createdDateExtended": int(time.time() * 1000),
122 "guid": str(uuid.uuid4()),
123 },
124 "ClientState": {"Collections": list(self.collections.values())},
125 },
126 ),
127 params=params_reminders,
128 )
129 return req.ok