@@ -108,15 +108,19 @@ def create(self, wait=False, resumable=True, retries=3):
108108
109109 if wait :
110110 while not self ._assembly_finished (response ):
111- sleep (1 ) # avoid hitting a rate limit
111+ # if a wait period is provided by the API due to polling
112+ # rate limit, we should use that period, otherwise, we
113+ # will fallback to 1 second.
114+ sleep_time = response .data .get ("info" , {}).get ("retryIn" , 1 )
115+ sleep (sleep_time )
112116 response = self .transloadit .get_assembly (
113117 assembly_url = response .data .get ("assembly_ssl_url" )
114118 )
115119
116120 if self ._rate_limit_reached (response ) and retries :
117121 # wait till rate limit is expired
118122 sleep (response .data .get ("info" , {}).get ("retryIn" , 1 ))
119- self .create (wait , resumable , retries - 1 )
123+ return self .create (wait , resumable , retries - 1 )
120124
121125 return response
122126
@@ -125,8 +129,10 @@ def _assembly_finished(self, response):
125129 is_aborted = status == "REQUEST_ABORTED"
126130 is_canceled = status == "ASSEMBLY_CANCELED"
127131 is_completed = status == "ASSEMBLY_COMPLETED"
128- is_failed = response .data .get ("error" ) is not None
129- return is_aborted or is_canceled or is_completed or is_failed
132+ error = response .data .get ("error" )
133+ is_failed = error is not None
134+ is_fetch_rate_limit = error == "ASSEMBLY_STATUS_FETCHING_RATE_LIMIT_REACHED"
135+ return is_aborted or is_canceled or is_completed or (is_failed and not is_fetch_rate_limit )
130136
131137 def _rate_limit_reached (self , response ):
132138 return response .data .get ("error" ) == "RATE_LIMIT_REACHED"
0 commit comments