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

1"""Reminders service.""" 

2 

3import json 

4import time 

5import uuid 

6from datetime import datetime 

7 

8from tzlocal import get_localzone 

9 

10 

11class RemindersService: 

12 """The 'Reminders' iCloud service.""" 

13 

14 def __init__(self, service_root, session, params): 

15 self.session = session 

16 self._params = params 

17 self._service_root = service_root 

18 

19 self.lists = {} 

20 self.collections = {} 

21 

22 self.refresh() 

23 

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 ) 

35 

36 # Open reminders 

37 req = self.session.get( 

38 self._service_root + "/rd/startup", 

39 params=params_reminders, 

40 ) 

41 

42 data = req.json() 

43 

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 

55 

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 

66 

67 temp.append( 

68 { 

69 "title": reminder["title"], 

70 "desc": reminder.get("description"), 

71 "due": due, 

72 }, 

73 ) 

74 self.lists[collection["title"]] = temp 

75 

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"] 

82 

83 params_reminders = dict(self._params) 

84 params_reminders.update( 

85 {"clientVersion": "4.0", "lang": "en-us", "usertz": str(get_localzone())}, 

86 ) 

87 

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 ] 

98 

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