44import requests
55import backoff
66
7+ from tqdm import tqdm
78from typing import (
89 Callable ,
910 Optional ,
@@ -52,6 +53,8 @@ def __init__(
5253 {"x-access-token" : api_key , "Content-Type" : "application/json" }
5354 )
5455 self .base_url = base_url
56+ self .show_progress = False
57+ self .progress_bar = None
5558 logger .debug (f"Initialized http client with base url: { self .base_url } " )
5659
5760 def _make_request (
@@ -120,16 +123,29 @@ def _handle_request_error(self, e: requests.exceptions.RequestException) -> None
120123 f"Invalid request: { str (e )} " , e .response
121124 ) from None
122125
123- @backoff .on_exception (backoff .expo , Exception , max_time = 500 , logger = None )
126+ @backoff .on_exception (
127+ backoff .constant , Exception , max_time = 500 , interval = 5 , logger = None , jitter = None
128+ )
124129 def _get_output (self , url : str ):
125130 """Get the output from an async request"""
126131 response_json = self .session .get (url ).json ()
127132 if (
128133 response_json .get ("status" ) == Status .in_progress
129134 or response_json .get ("status" ) == Status .processing
130135 ):
136+ percentage = response_json .get ("data" ).get ("percentage" )
137+ if percentage and self .show_progress and self .progress_bar :
138+ self .progress_bar .n = int (percentage )
139+ self .progress_bar .update (0 )
140+
131141 logger .debug ("Waiting for processing to complete" )
132142 raise Exception ("Stuck on processing status" ) from None
143+ if self .show_progress and self .progress_bar :
144+ self .progress_bar .n = 100
145+ self .progress_bar .update (0 )
146+ self .progress_bar .close ()
147+ self .progress_bar = None
148+ self .show_progress = False
133149 return response_json .get ("response" ) or response_json
134150
135151 def _parse_response (self , response : requests .Response ):
@@ -145,6 +161,13 @@ def _parse_response(self, response: requests.Response):
145161 response_json .get ("status" ) == Status .processing
146162 and response_json .get ("request_type" , "sync" ) == "sync"
147163 ):
164+ if self .show_progress :
165+ self .progress_bar = tqdm (
166+ total = 100 ,
167+ position = 0 ,
168+ leave = True ,
169+ bar_format = "{l_bar}{bar:100}{r_bar}{bar:-100b}" ,
170+ )
148171 response_json = self ._get_output (
149172 response_json .get ("data" ).get ("output_url" )
150173 )
@@ -168,9 +191,12 @@ def _parse_response(self, response: requests.Response):
168191 f"Invalid request: { response .text } " , response
169192 ) from None
170193
171- def get (self , path : str , ** kwargs ) -> requests .Response :
194+ def get (
195+ self , path : str , show_progress : Optional [bool ] = False , ** kwargs
196+ ) -> requests .Response :
172197 """Make a get request"""
173- return self ._make_request (self .session .get , path , ** kwargs )
198+ self .show_progress = show_progress
199+ return self ._make_request (method = self .session .get , path = path , ** kwargs )
174200
175201 def post (self , path : str , data = None , ** kwargs ) -> requests .Response :
176202 """Make a post request"""
0 commit comments