@@ -31,6 +31,7 @@ def __init__(
3131 self ,
3232 email : str ,
3333 password : str ,
34+ famly_base_url : str ,
3435 pictures_folder : Path ,
3536 stop_on_existing : bool ,
3637 text_comments : bool ,
@@ -52,7 +53,9 @@ def __init__(
5253 self .state_file = state_file
5354 self .downloaded_images = self .load_state ()
5455
55- self ._apiClient = ApiClient (user_agent = user_agent , access_token = access_token )
56+ self ._apiClient = ApiClient (
57+ base_url = famly_base_url , user_agent = user_agent , access_token = access_token
58+ )
5659 if not access_token :
5760 self ._apiClient .login (email , password )
5861
@@ -88,6 +91,10 @@ def get_all_children(self):
8891
8992 return all_children
9093
94+ def get_parents_ids (self , child_id : str ) -> set [str ]:
95+ relations = self ._apiClient .get_relations (child_id )
96+ return {x ["loginId" ] for x in relations if x ["loginId" ]}
97+
9198 def download_images_from_notes (self , child_id , first_name ):
9299 click .secho (
93100 f"Downloading learning journey images for { first_name } ..." , fg = "green"
@@ -254,6 +261,59 @@ def download_images_from_messages(self):
254261
255262 self .save_state ()
256263
264+ def download_images_from_feed (self , liked_by_ids : set [str ]):
265+ click .secho ("Downloading liked images in posts..." , fg = "green" )
266+
267+ cursor = None
268+ older_than = None
269+ while True :
270+ click .echo ("Fetching next 10 Posts" )
271+ response = self ._apiClient .feed (
272+ cursor = cursor , older_than = older_than , limit = 10
273+ )
274+ if not response ["feedItems" ]:
275+ break
276+ last_item = response ["feedItems" ][- 1 ]
277+ cursor = last_item ["feedItemId" ]
278+ older_than = last_item ["createdDate" ]
279+ for feed_item in response ["feedItems" ]:
280+ if not feed_item ["originatorId" ].startswith ("Post:" ):
281+ # not a Post item
282+ continue
283+ create_date = feed_item ["createdDate" ]
284+ for img_dict in feed_item ["images" ]:
285+ if not (
286+ img_dict ["liked" ]
287+ or [
288+ like
289+ for like in img_dict ["likes" ]
290+ if like ["loginId" ] in liked_by_ids
291+ ]
292+ ):
293+ # not liked by parents
294+ continue
295+ img = Image .from_dict (
296+ img_dict ,
297+ date_override = create_date ,
298+ text_override = feed_item ["body" ] if self .text_comments else None ,
299+ )
300+ click .echo (f" - image { img .img_id } from post at { create_date } " )
301+
302+ if img .img_id in self .downloaded_images :
303+ click .secho (
304+ f"Image { img .img_id } already downloaded, { 'stopping download' if self .stop_on_existing else 'skipping' } ." ,
305+ fg = "yellow" ,
306+ )
307+ if self .stop_on_existing :
308+ return
309+ else :
310+ continue
311+ file_path = self .download_file_path (img , "post" )
312+ self .fetch_image (img , file_path )
313+ self .mark_as_downloaded (img .img_id )
314+
315+ self .save_state ()
316+
257317 def download_file_path (self , img : BaseImage , filename_prefix : str ) -> Path :
258318 """Generate the file path for the downloaded image."""
259319
0 commit comments