
    i<                     n   S SK Jr  S SKJr  S SKrS SKrS SKrS SKrS SKJ	r	  S SK
JrJr  S SKJr  S SKrS SKrS SKJr  S SKJr  S S	KJr  S S
K JrJr  S SKJrJr  S SKJr  \R6                  " \R8                  S9  \R:                  " \5      rSr Sr!\RD                  " \ SS9  \RF                  RI                  \!5      (       a%  \%" \!S5       r&\RN                  " \&5      r(SSS5        O0 r(\(RS                  5        V Vs0 s H  u  p\RU                  U 5      U_M     snn r(\RV                  r,\" SS9r- " S S\5      r. " S S\5      r/\-Ra                  S\	\/   SS9S\.4S j5       r\-Ra                  S\	\/   SS9S\.4S  j5       r1S!r2\-Rg                  S"5      S\4S# j5       r4g! , (       d  f       N= fs  snn f )$    )FastAPI)	BaseModelN)List)ThreadPoolExecutoras_completed)Image)BytesIO)datetime)FileResponse)r   Request)RedirectResponseJSONResponse)predict_all)leveltemp_imageszimage_hashes.jsonT)exist_okrzImage Filter API)titlec                   0    \ rS rSr% \\   \S'   \\S'   Srg)ImageBatchRequest.   
image_urlsactivity N)__name__
__module____qualname____firstlineno__r   str__annotations____static_attributes__r       '/var/www/html/ai-image-ml/api_filter.pyr   r   .   s    S	Mr"   r   c                   :    \ rS rSr% \\S'   \\S'   \\   \S'   Srg)FilterResponse3   	image_urlacceptedreasonsr   N)	r   r   r   r   r   r    boolr   r!   r   r"   r#   r%   r%   3   s    NN#Yr"   r%   z/filterzFilter multiple images by URL)response_modelsummaryrequestc                 j  ^ / nU R                   m[        T5        S[        S[        4U4S jjn[	        SS9 nU R
                   Vs/ s H  oCR                  X$5      PM     nn[        U5       H"  nUR                  UR                  5       5        M$     S S S 5        U$ s  snf ! , (       d  f       U$ = f)Nr'   returnc           
        >  [         R                  SU  35        [        R                  " U SS9nUR                  S:w  a  [        U SS/S9$ U R                  S5      S	   R                  S
5      S   R                  5       nUS;  a  [        U SS/S9$ [        R                  " 5        SU 3n[        R                  R                  [        U5      n[        US5       nUR                  UR                   5        S S S 5         ["        R                  " [%        UR                   5      5      n['        U5      nU[(        ;   a.  [(        U   n[        R*                  " U5        [        U SSU 3/S9$ U [(        U'   [        [,        S5       n[.        R0                  " [(        R3                  5        V	V
s0 s H  u  p[5        U	5      U
_M     sn
n	USS9  S S S 5        [;        UT5      n[        R*                  " U5        [        U UR                  SS5      UR                  SS/5      S9$ ! , (       d  f       GN3= fs  sn
n	f ! , (       d  f       Nt= f! [6         a%  n[         R9                  SU  SU 35         S nANS nAff = f! [6         aF  n[         R=                  SU  S[5        U5       35        [        U SS[5        U5       3/S9s S nA$ S nAff = f)NzReceived image URL: 
   )timeout   Fz"Failed to download image from URL.r'   r(   r)   .?r   )jpgjpegpngzUnsupported image format.wbz>Duplicate image detected. Matches previously processed image: w   )indentzHashing failed for z: r(   r)   zImage rejected.zError processing image zError: )loggerinforequestsgetstatus_coder%   splitloweruuiduuid4ospathjoinTEMP_DIRopenwritecontentr   r	   	hash_func	hash_dictremove	HASH_FILEjsondumpitemsr   	Exceptionwarningr   error)r'   responseextfilenamefilepathfimgimg_hashoriginal_urlkveresultr   s                r#   process_url"filter_images.<locals>.process_url?   s   =	KK.yk:;||Ir:H##s*%'"AB  //#&r*005a8>>@C00%'"89  **,q.Hww||Hh7Hh%(() &Gjj)9)9!:;$S>y(#,X#6LIIh')"+!&#abnao!p q  '0	(#)S)QIIY__5FG5FTQs1vqy5FGSTU * !(3FIIh!#J6

9/@.AB ; &%( H *)  G!4YKr!EFFG  	LL29+RAxHI!#"3q6(+, 	s   AI? AI? A
I? H$8I? A+I -I (H<.H6H<I AI? $
H3.I? 6H<<
I
I 	I? 
I 
I<I72I? 7I<<I? ?
K	;K
K
K   )max_workers)
r   printr   r%   r   r   submitr   appendrd   )r-   resultsre   executorurlfuturesfuturer   s          @r#   filter_imagesrq   9   s    GH	(O>s >~ >B 
	*h@G@R@RS@R??;4@RS"7+FNN6==?+ , 
+
 N	 T 
+	*
 Ns   B#B!3B#B##
B2z/filter_devz,Filter multiple images by URL (bypass logic)c           	          / nU R                    H5  n[        R                  SU 35        UR                  [	        US/ S95        M7     U$ )Nz"Bypass filter received image URL: Tr4   )r   r?   r@   rk   r%   )r-   rl   r'   s      r#   filter_images_bypassrs      sN    G''	8DE~
 	 ( Nr"   zQhttps://grq-img-store.sgp1.digitaloceanspaces.com/prod/classifiers_zip/latest.zipz	/downloadc                 n    0 nU R                   R                  S5      nU(       a  X!S'   [        [        US9$ )NzIf-Modified-Since)headers)ru   rB   r   
SPACES_URL)r-   ru   if_modified_sinces      r#   download_ziprx      s:     G++,?@'8#$ J88r"   )5fastapir   pydanticr   rA   rF   rH   loggingtypingr   concurrent.futuresr   r   PILr   	imagehashrS   ior	   r
   fastapi.responsesr   r   r   r   rq   r   basicConfigINFO	getLoggerr   r?   rK   rR   makedirsrI   existsrL   r]   loadrP   rU   hex_to_hashphashrO   appr   r%   postrs   rv   rB   rx   )ra   rb   s   00r#   <module>r      s       	   ?      * $ < &   ',, '			8	$ 	 Ht $ 77>>)	i	IIaL	 
	 I 6?__5FG5FTQY""1%q(5FG	OO	 &'	 
Y  )D$8BabK, K cK\ -^(<Ftu	"3 	 v	 a
9' 9 9s 
	 Hs   F <F1 
F.