Skip to content

Commit

Permalink
Fix ratelimit with platerecognizer (#70)
Browse files Browse the repository at this point in the history
Co-authored-by: Daniel Szilagyi <[email protected]>
  • Loading branch information
danielszilagyi and Daniel Szilagyi authored Dec 22, 2024
1 parent 11f2d85 commit b6c92eb
Showing 1 changed file with 43 additions and 29 deletions.
72 changes: 43 additions & 29 deletions index.py
Original file line number Diff line number Diff line change
Expand Up @@ -111,38 +111,52 @@ def code_project(image):
else:
return plate_number, score, None, None

def plate_recognizer(image):
def plate_recognizer(image, retries=3, delay=1):
api_url = config['plate_recognizer'].get('api_url') or PLATE_RECOGIZER_BASE_URL
token = config['plate_recognizer']['token']
headers = {'Authorization': f'Token {token}'}
data = dict(regions=config['plate_recognizer']['regions'])

for attempt in range(retries):
response = requests.post(
api_url,
data=data,
files=dict(upload=image),
headers=headers
)

if response.status_code == 429: # Too Many Requests
_LOGGER.warning(f"Rate limit hit. Retrying in {delay} seconds...")
time.sleep(delay)
delay *= 2 # Exponential backoff
continue

if response.status_code != 201:
_LOGGER.error(f"API error: {response.status_code}, {response.text}")
return None, None, None, None

response_json = response.json()
_LOGGER.debug(f"response: {response_json}")

if response_json.get('results') is None or len(response_json['results']) == 0:
_LOGGER.debug(f"No plates found or invalid response: {response_json}")
return None, None, None, None

plate_number = response_json['results'][0].get('plate')
score = response_json['results'][0].get('score')
watched_plate, watched_score, fuzzy_score = check_watched_plates(
plate_number, response_json['results'][0].get('candidates')
)
if fuzzy_score:
return plate_number, score, watched_plate, fuzzy_score
elif watched_plate:
return plate_number, watched_score, watched_plate, None
else:
return plate_number, score, None, None

response = requests.post(
api_url,
data=dict(regions=config['plate_recognizer']['regions']),
files=dict(upload=image),
headers={'Authorization': f'Token {token}'}
)

response = response.json()
_LOGGER.debug(f"response: {response}")

if response.get('results') is None:
_LOGGER.error(f"Failed to get plate number. Response: {response}")
return None, None, None, None

if len(response['results']) == 0:
_LOGGER.debug(f"No plates found")
return None, None, None, None
_LOGGER.error(f"Failed to get plate number after {retries} retries.")
return None, None, None, None

plate_number = response['results'][0].get('plate')
score = response['results'][0].get('score')

watched_plate, watched_score, fuzzy_score = check_watched_plates(plate_number, response['results'][0].get('candidates'))
if fuzzy_score:
return plate_number, score, watched_plate, fuzzy_score
elif watched_plate:
return plate_number, watched_score, watched_plate, None
else:
return plate_number, score, None, None

def check_watched_plates(plate_number, response):
config_watched_plates = config['frigate'].get('watched_plates', [])
Expand Down Expand Up @@ -595,4 +609,4 @@ def main():


if __name__ == '__main__':
main()
main()

0 comments on commit b6c92eb

Please sign in to comment.