@@ -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
147161def check_watched_plates (plate_number , response ):
148162 config_watched_plates = config ['frigate' ].get ('watched_plates' , [])
@@ -595,4 +609,4 @@ def main():
595609
596610
597611if __name__ == '__main__' :
598- main ()
612+ main ()
0 commit comments