99from paapi5_python_sdk .get_items_request import GetItemsRequest
1010from paapi5_python_sdk .search_items_request import SearchItemsRequest
1111from paapi5_python_sdk .get_variations_request import GetVariationsRequest
12+ from paapi5_python_sdk .get_browse_nodes_request import GetBrowseNodesRequest
1213from paapi5_python_sdk .partner_type import PartnerType
1314from paapi5_python_sdk .rest import ApiException
1415
1516from amazon .constant import DOMAINS , REGIONS , CONDITION
1617from amazon .constant import PRODUCT_RESOURCES , SEARCH_RESOURCES , VARIATION_RESOURCES
18+ from amazon .constant import BROWSE_RESOURCES
1719from amazon .exception import AmazonException
18- from amazon .parse import parse_product
20+ from amazon .parse import parse_product , AmazonBrowseNode , parse_browsenode
1921from amazon .tools import get_asin , chunks
2022
2123import time
@@ -226,8 +228,8 @@ def search_products(self, item_count=10, item_page=1, items_per_page=10, keyword
226228 raise AmazonException ('ValueError' , 'Arg items_per_page should be between 1 and 10' )
227229 if item_count > 100 or item_count < 1 :
228230 raise AmazonException ('ValueError' , 'Arg item_count should be between 1 and 100' )
229- if item_page > 10 or item_page < 1 :
230- raise AmazonException ('ValueError' , 'Arg item_page should be between 1 and 10 ' )
231+ if item_page < 1 :
232+ raise AmazonException ('ValueError' , 'Arg item_page should be 1 or higher ' )
231233 if not keywords and not actor and not artist and not author and not brand and not title :
232234 raise AmazonException ('ValueError' , 'At least one of the following args must be '
233235 'provided: keywords, actor, artist, author, brand,'
@@ -284,6 +286,8 @@ def search_products(self, item_count=10, item_page=1, items_per_page=10, keyword
284286 results .append (parse_product (item ))
285287 if len (results ) >= item_count :
286288 break
289+ if len (response .search_result .items ) < items_per_page :
290+ break
287291 else :
288292 break
289293 if response .errors is not None :
@@ -293,8 +297,6 @@ def search_products(self, item_count=10, item_page=1, items_per_page=10, keyword
293297 break
294298 raise AmazonException ('ResponseError' , e )
295299 item_page += 1
296- if item_page > 10 :
297- break
298300
299301 if results :
300302 return results
@@ -331,8 +333,8 @@ def get_variations(self, asin, item_count=10, item_page=1, items_per_page=10, co
331333 raise AmazonException ('ValueError' , 'Arg items_per_page should be between 1 and 10' )
332334 if item_count > 100 or item_count < 1 :
333335 raise AmazonException ('ValueError' , 'Arg item_count should be between 1 and 100' )
334- if item_page > 10 or item_page < 1 :
335- raise AmazonException ('ValueError' , 'Arg item_page should be between 1 and 10 ' )
336+ if item_page < 1 :
337+ raise AmazonException ('ValueError' , 'Arg item_page should be 1 or higher ' )
336338
337339 results = []
338340 while len (results ) < item_count :
@@ -373,17 +375,70 @@ def get_variations(self, asin, item_count=10, item_page=1, items_per_page=10, co
373375 results .append (parse_product (item ))
374376 if len (results ) >= item_count :
375377 break
378+ if len (response .variations_result .items ) < items_per_page :
379+ break
376380 else :
377381 break
378382 if response .errors is not None :
379383 raise AmazonException (response .errors [0 ].code , response .errors [0 ].message )
380384 except Exception as e :
381385 raise AmazonException ('ResponseError' , e )
382386 item_page += 1
383- if item_page > 10 :
384- break
385387
386388 if results :
387389 return results
388390 else :
389391 return None
392+
393+ def get_browsenodes (self , browse_nodes , async_req = False ):
394+ """Get browse nodes information from Amazon.
395+
396+ Args:
397+ browse_nodes (list): List of strings containing the browse node ids.
398+ async_req (bool, optional): Specify if a thread should be created to
399+ run the request. Defaults to False.
400+
401+ Returns:
402+ dict: A dictionary containing the browse node information.
403+ """
404+
405+ if isinstance (browse_nodes , list ) is False :
406+ raise Exception ('Browse nodes parameter should be a list' )
407+ elif not browse_nodes :
408+ raise Exception ('Browse nodes parameter can\' t be empty' )
409+
410+ try :
411+ request = GetBrowseNodesRequest (
412+ partner_tag = self .tag ,
413+ partner_type = PartnerType .ASSOCIATES ,
414+ marketplace = self .marketplace ,
415+ browse_node_ids = browse_nodes ,
416+ languages_of_preference = None ,
417+ resources = BROWSE_RESOURCES )
418+ except ValueError as e :
419+ raise AmazonException ("ValueError" , e )
420+
421+ try :
422+ self ._throttle ()
423+ if async_req :
424+ thread = self .api .get_browse_nodes (request , async_req = True )
425+ response = thread .get ()
426+ else :
427+ response = self .api .get_browse_nodes (request )
428+ except ApiException as e :
429+ raise AmazonException ('ApiException' , e )
430+
431+ try :
432+ if response .browse_nodes_result is not None :
433+ res = [AmazonBrowseNode (item ) for item in response .browse_nodes_result .browse_nodes ]
434+ return parse_browsenode (res )
435+ if response .errors is not None :
436+ raise AmazonException (response .errors [0 ].code , response .errors [0 ].message )
437+ except TypeError as e :
438+ raise AmazonException ("TypeError" , e )
439+ except ValueError as e :
440+ raise AmazonException (ValueError , e )
441+ except AmazonException as e :
442+ raise AmazonException (e .status , e .reason )
443+ except Exception as e :
444+ raise AmazonException ("General" , e )
0 commit comments