
    pi                        S SK Jr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Jr  S S
KJr  \R4                  " \R6                  S9  \R8                  " \5      rSrSr \RB                  " \SS9  S r"\RF                  RI                  \ 5      (       a	  \"" \ 5      r%O0 r%\%RM                  5        V Vs0 s H  u  p\RO                  U 5      U_M     snn r%\RP                  r)\" SS9r* " S S\5      r+ " S S\5      r,\*R[                  S\
\,   SS9S\+4S j5       r\*R[                  S\
\,   SS9S\+4S j5       r.Sr/\*Ra                  S 5      S\4S! j5       r1gs  snn f )"    )FastAPIRequest)	BaseModelN)List)ThreadPoolExecutoras_completed)Image)BytesIO)datetime)RedirectResponseJSONResponse)predict_all)leveltemp_imageszimage_hashes.jsonT)exist_okc                 P    [        U S5       nUR                  5       R                  5       nU(       d  0 sS S S 5        $  [        R                  " U5      sS S S 5        $ ! [        R
                   a    0 n[        UR                  5       5       Hb  u  pE [        R                  " U5      n[        U[        5      (       a  UR                  U5        MD  Xc[        U5      '   MS  ! [         a     M`  f = f   Us sS S S 5        $ f = f! , (       d  f       g = f! [         a    0 s $ f = f)Nr)openreadstripjsonloadsJSONDecodeError	enumerate
splitlines
isinstancedictupdatestr	ExceptionFileNotFoundError)pathfcontentdatailineobjs          '/var/www/html/ai-image-ml/api_filter.pysafe_load_jsonr*      s    $_ffhnn&G _zz'* _ '' (););)=>GA!"jj.%c400 KK,+.QL$ ! !  ? % _ _&  	s   D 'D	D  A	D 4D<C!DC!D!
C/	+D.C/	/D6D7	D DD
DD D D%$D%zImage Filter API)titlec                   0    \ rS rSr% \\   \S'   \\S'   Srg)ImageBatchRequestC   
image_urlsactivity N)__name__
__module____qualname____firstlineno__r   r   __annotations____static_attributes__r1       r)   r-   r-   C   s    S	Mr8   r-   c                   :    \ rS rSr% \\S'   \\S'   \\   \S'   Srg)FilterResponseH   	image_urlacceptedreasonsr1   N)	r2   r3   r4   r5   r   r6   boolr   r7   r1   r8   r)   r:   r:   H   s    NN#Yr8   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osr"   joinTEMP_DIRr   writer$   r	   r
   	hash_func	hash_dictremove	HASH_FILEr   dumpitemsr   r    warningr   error)r<   responseextfilenamefilepathr#   imgimg_hashoriginal_urlkveresultr0   s                r)   process_url"filter_images.<locals>.process_urlT   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 * !84F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)
r0   printr   r:   r   r/   submitr   appendrs   )rB   resultsrt   executorurlfuturesfuturer0   s          @r)   filter_imagesr   N   s    GH	(O?s ?~ ?D 
	*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: TrI   )r/   rT   rU   rz   r:   )rB   r{   r<   s      r)   filter_images_bypassr      sN    G''	8DE~
 	 ( Nr8   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)r   rW   r   
SPACES_URL)rB   r   if_modified_sinces      r)   download_zipr      s:     G++,?@'8#$ J88r8   )2fastapir   r   pydanticr   rV   r[   r]   loggingtypingr   concurrent.futuresr   r   PILr	   	imagehashr   ior
   r   fastapi.responsesr   r   r   r   basicConfigINFO	getLoggerr2   rT   r_   rd   makedirsr*   r"   existsrb   rf   hex_to_hashphashra   appr-   r:   postr   r   rW   r   )rp   rq   s   00r)   <module>r      s   $    	   ?      < &   ',, '			8	$ 	 Ht $2 77>>)y)II 6?__5FG5FTQY""1%q(5FG	OO	 &'	 
Y  )D$8BabL, L cL^ -^(<Ftu	"3 	 v	 a
9' 9 9e Hs   E;