Skip to content

Commit 20b642f

Browse files
committed
Merge branch 'master' of github.com:ljmerza/frigate_plate_recognizer
2 parents 6ae17fb + b6c92eb commit 20b642f

File tree

1 file changed

+43
-29
lines changed

1 file changed

+43
-29
lines changed

index.py

Lines changed: 43 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -111,38 +111,52 @@ def code_project(image):
111111
else:
112112
return plate_number, score, None, None
113113

114-
def plate_recognizer(image):
114+
def plate_recognizer(image, retries=3, delay=1):
115115
api_url = config['plate_recognizer'].get('api_url') or PLATE_RECOGIZER_BASE_URL
116116
token = config['plate_recognizer']['token']
117+
headers = {'Authorization': f'Token {token}'}
118+
data = dict(regions=config['plate_recognizer']['regions'])
119+
120+
for attempt in range(retries):
121+
response = requests.post(
122+
api_url,
123+
data=data,
124+
files=dict(upload=image),
125+
headers=headers
126+
)
127+
128+
if response.status_code == 429: # Too Many Requests
129+
_LOGGER.warning(f"Rate limit hit. Retrying in {delay} seconds...")
130+
time.sleep(delay)
131+
delay *= 2 # Exponential backoff
132+
continue
133+
134+
if response.status_code != 201:
135+
_LOGGER.error(f"API error: {response.status_code}, {response.text}")
136+
return None, None, None, None
137+
138+
response_json = response.json()
139+
_LOGGER.debug(f"response: {response_json}")
140+
141+
if response_json.get('results') is None or len(response_json['results']) == 0:
142+
_LOGGER.debug(f"No plates found or invalid response: {response_json}")
143+
return None, None, None, None
144+
145+
plate_number = response_json['results'][0].get('plate')
146+
score = response_json['results'][0].get('score')
147+
watched_plate, watched_score, fuzzy_score = check_watched_plates(
148+
plate_number, response_json['results'][0].get('candidates')
149+
)
150+
if fuzzy_score:
151+
return plate_number, score, watched_plate, fuzzy_score
152+
elif watched_plate:
153+
return plate_number, watched_score, watched_plate, None
154+
else:
155+
return plate_number, score, None, None
117156

118-
response = requests.post(
119-
api_url,
120-
data=dict(regions=config['plate_recognizer']['regions']),
121-
files=dict(upload=image),
122-
headers={'Authorization': f'Token {token}'}
123-
)
124-
125-
response = response.json()
126-
_LOGGER.debug(f"response: {response}")
127-
128-
if response.get('results') is None:
129-
_LOGGER.error(f"Failed to get plate number. Response: {response}")
130-
return None, None, None, None
131-
132-
if len(response['results']) == 0:
133-
_LOGGER.debug(f"No plates found")
134-
return None, None, None, None
157+
_LOGGER.error(f"Failed to get plate number after {retries} retries.")
158+
return None, None, None, None
135159

136-
plate_number = response['results'][0].get('plate')
137-
score = response['results'][0].get('score')
138-
139-
watched_plate, watched_score, fuzzy_score = check_watched_plates(plate_number, response['results'][0].get('candidates'))
140-
if fuzzy_score:
141-
return plate_number, score, watched_plate, fuzzy_score
142-
elif watched_plate:
143-
return plate_number, watched_score, watched_plate, None
144-
else:
145-
return plate_number, score, None, None
146160

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

596610

597611
if __name__ == '__main__':
598-
main()
612+
main()

0 commit comments

Comments
 (0)