
    L6j+                    t   d dl mZ d dlZd dlZd dlZd dlZd dlmZ d dlm	Z	 d dl
mZmZmZmZ d dlZd dlZd dlmZ 	 d dlmZ n# e$ r dZY nw xY wh dZh d	Zd
ZdZe G d d                      Zd@dZd@dZd@dZdAdZ G d d          Z dBdCd$Z!dBdDd)Z"dEd,Z#dFdGd4Z$dHd8Z%	 	 	 dIdJd:Z&	 	 	 	 dKdLd?Z'dS )M    )annotationsN)	dataclass)Path)IterableListSequenceTuple)Image)NudeDetector>   .bmp.jpg.png.jpeg.webp>   .avi.m4v.mkv.mov.mp4.webm)anusbuttockbuttocksbreastgenitalpenisvaginavulvapussytesticlenipple)facefeetfootarmpitbellynavelc                  l    e Zd ZU ded<   ded<   ded<   ded<   dZded<   d	Zd
ed<   ddZddZddZdS )Boxintx1y1x2y2      ?floatscore	sensitivestrlabelwidthheightreturn'Box'c                   t          t          dt          |dz
  t          | j                                      t          dt          |dz
  t          | j                                      t          dt          |t          | j                                      t          dt          |t          | j                                      t          | j	                  | j
                  S )Nr      )r)   maxminr*   r+   r,   r-   r.   r0   r1   r4   )selfr5   r6   s      3/home/wildlama/intimate-blur-app/app/blur_engine.pyclampz	Box.clamp9   s    3uqy#dg,,//003vz3tw<<00113uc$'ll++,,3vs47||,,--$*J
 
 	
    marginc                ^   | j         | j        z
  }| j        | j        z
  }t	          t          ||z                      }t	          t          ||z                      }t          | j        |z
  | j        |z
  | j         |z   | j        |z   | j        | j                  	                    ||          S N)
r-   r+   r.   r,   r*   roundr)   r1   r4   r?   )r=   r5   r6   rA   bwbhdxdys           r>   expandedzBox.expandedC   s    WtwWtwrF{##$$rF{##$$47R<2tw|TWr\4:W[Wabbhhinpvwwwr@   boolc                N    | j         | j        dz   k    o| j        | j        dz   k    S )N   )r-   r+   r.   r,   )r=   s    r>   validz	Box.validJ   s'    w1$>47Q;)>>r@   N)r5   r*   r6   r*   r7   r8   )r5   r*   r6   r*   rA   r0   r7   r8   )r7   rJ   )	__name__
__module____qualname____annotations__r1   r4   r?   rI   rM    r@   r>   r)   r)   0   s         GGGGGGGGGGGGEE
 
 
 
x x x x? ? ? ? ? ?r@   r)   pathr   r7   rJ   c                R    | j                                         t          t          z  v S rC   )suffixlower
IMAGE_EXTS
VIDEO_EXTSrS   s    r>   is_supportedrZ   N   s     ;*z"999r@   c                B    | j                                         t          v S rC   )rU   rV   rW   rY   s    r>   is_imager\   R       ;*,,r@   c                B    | j                                         t          v S rC   )rU   rV   rX   rY   s    r>   is_videor_   V   r]   r@   r4   r3   c                    |                                                      dd          t          fdt          D                       rdS t          fdt          D                       S )N_-c              3      K   | ]}|v V  	d S rC   rR   .0kls     r>   	<genexpr>z#_sensitive_label.<locals>.<genexpr>\   s'      
,
,a16
,
,
,
,
,
,r@   Fc              3      K   | ]}|v V  	d S rC   rR   rd   s     r>   rh   z#_sensitive_label.<locals>.<genexpr>^   s'      22!qAv222222r@   )rV   replaceanyIGNORED_KEYWORDSSENSITIVE_KEYWORDS)r4   rg   s    @r>   _sensitive_labelrn   Z   so    c3''A

,
,
,
,+
,
,
,,, u22221222222r@   c                       e Zd ZdddZdd	Zd
S )SensitiveDetector      ?score_thresholdr0   c                f    t           t          d          t                      | _        || _        d S )Nz1nudenet is not installed or could not be imported)r   RuntimeErrordetectorrr   )r=   rr   s     r>   __init__zSensitiveDetector.__init__b   s0    RSSS$.r@   	frame_bgr
np.ndarrayr7   	List[Box]c           
     x   t          j        |t           j                  }| j                            |          }g }|j        d d         \  }}|D ]h}t          |                    d|                    dd                              }t          |                    d|                    dd                              }	|	| j	        k     st          |          s|                    d          p|                    d	          }
|
t          |
          d
k    rd |
D             \  }}}}t          t          |          t          |          t          ||z             t          ||z             |	|                              ||          }|                                r|                    |           j|S )NrL   classr4    r1   
confidencer/   boxbbox   c                ,    g | ]}t          |          S rR   )r0   )re   vs     r>   
<listcomp>z0SensitiveDetector.detect_bgr.<locals>.<listcomp>w   s    222E!HH222r@   )cv2cvtColorCOLOR_BGR2RGBru   detectshaper3   getr0   rr   rn   lenr)   r*   r?   rM   append)r=   rw   	frame_rgb
detectionsboxeshwdetr4   r1   rawxyrE   rF   r~   s                   r>   
detect_bgrzSensitiveDetector.detect_bgrh   s   LC,=>>	])))44
rr"1 	" 	"C")=)=>>??E#'''377<+E+EFFGGEt+++3CE3J3J+''%..3CGGFOOC{c#hh!mm22c222LAq"bc!ffc!ffc!b&kk3q2v;;uMMSSTUWXYYCyy{{ "S!!!r@   N)rq   )rr   r0   )rw   rx   r7   ry   )rN   rO   rP   rv   r   rR   r@   r>   rp   rp   a   sA        / / / / /     r@   rp   =   333333?rw   rx   r   Sequence[Box]blur_strengthr*   rA   r0   c                n   |dz  dk    r|dz  }t          dt          |                    }|                                 }|j        d d         \  }}|D ]}|                    |||          }|                                s.||j        |j        |j        |j	        f         }	|	j
        dk    r\t          |t          dt          |	j        d d                   dz  dz  dz                       }
|
dz  dk    r|
dz  }
t          j        |	|
|
fd          ||j        |j        |j        |j	        f<   |S )NrL   r   r:      )r;   r*   copyr   rI   rM   r,   r.   r+   r-   sizer<   r   GaussianBlur)rw   r   r   rA   outr   r   r~   broirf   s              r>   
blur_boxesr   ~   sE   qA3}--..M
..

C9RaR=DAq E ELLAv&&wwyy 	!$qt)QT!$Y&'8q==s1s39RaR='9'9Q'>!&Ca&GHHIIq5A::FA$'$4S1a&!$D$DADIqtADy !!Jr@   
input_pathoutput_pathru   dictc                   t          j        t          |           t           j                  }|t	          d|            |                    |          }t          ||||          }|j                            dd           t          j	        t          |          |          }|st	          d|           dt          |          t          |          dS )NCannot read image: r   rA   Tparentsexist_okzCannot write image: image)typer   output)r   imreadr3   IMREAD_COLOR
ValueErrorr   r   parentmkdirimwriter   )	r   r   ru   r   rA   r   r   resultoks	            r>   process_imager      s    Js:(899E};z;;<<<&&EuM&QQQFTD999	S%%v	.	.B ?===>>>3u::[AQAQRRRr@   ar   c                6   t          | j        |j                  }t          | j        |j                  }t          | j        |j                  }t          | j        |j                  }t          d||z
            }t          d||z
            }||z  }t          d| j        | j        z
            t          d| j        | j        z
            z  }	t          d|j        |j        z
            t          d|j        |j        z
            z  }
|	|
z   |z
  }|r||z  ndS )Nr           )r;   r+   r,   r<   r-   r.   )r   r   ix1iy1ix2iy2iwihinterarea_aarea_bdenoms               r>   iour      s    
adAD//C
adAD//C
adAD//C
adAD//C	Qc			B	Qc			BGEAD14K  3q!$+#6#66FAD14K  3q!$+#6#66FVOe#E!*55==s*r@   ?皙?currentpreviousalphaiou_thresholdry   c                   g }t                      }| D ]8}d}d}t          |          D ]$\  }	}
|	|v r
t          ||
          }||k    r|	}|}%|dk    r||k    r||         }
|                    |           |                    t          t          ||j        z  d|z
  |
j        z  z             t          ||j        z  d|z
  |
j        z  z             t          ||j	        z  d|z
  |
j	        z  z             t          ||j
        z  d|z
  |
j
        z  z             |j        |j                             #|                    |           :|S )Nr   r   r:   )set	enumerater   addr   r)   r*   r+   r,   r-   r.   r1   r4   )r   r   r   r   smoothed	used_prevcurbest_i
best_scoreidxprevr1   s               r>   smooth_boxesr      su   H%%I ! !
"8,, 	# 	#ICiTNNEz!!"
Q;;:66F#DMM&!!!OOCECFNa%i47%::;;ECFNa%i47%::;;ECFNa%i47%::;;ECFNa%i47%::;;		      OOC    Or@   originalsilent_videofinal_outputc                &   t          j        d          1t          j        t          |          t          |                     dS dddt          |          dt          |           dddddd	d
ddt          |          g}t	          j        |t          j        t          j        d          }|j        dk    r,|                                r|	                    d           dS t          j        t          |          t          |                     dS )NffmpegFz-yz-iz-mapz0:v:0z1:a:0?z-c:vr   z-c:aaacz	-shortestT)stdoutstderrtextr   )
missing_ok)
shutilwhichmover3   
subprocessrunPIPE
returncodeexistsunlink)r   r   r   cmdprocs        r>   _ffmpeg_copy_audior      s    |H%C%%s<'8'8999u$c,c(mmL
C >#jojoTXYYYD! 3 3 5 5t,,,t
KL!!3|#4#45555r@   frame_indexc                   |j                             dd           t          |           rt          j        t          |           t          j                  }|t          d|            |                    |          }t          ||||          }t          j
        t          |          |           ddt          |          t          |          dS t          |           st          d	| j                   t          j        t          |                     }	|	                                st          d
|            t!          |	                    t          j                  pd          }
t'          |	                    t          j                  pd          }|
dk    r/t+          dt-          t!          |          |
dz
                      }nt+          dt!          |                    }|	                    t          j        |           |	                                \  }}|	                                 |r|t          d| d          |                    |          }t          ||||          }t          j
        t          |          |          }|st          d|           d||
|t          |          t          |          dS )zHCreate a blurred preview still for an image or one selected video frame.Tr   Nr   r   r   r   )r   r   r   r   zUnsupported file type: Cannot open video:       8@r:   zCannot read frame z from videozCannot write preview: video)r   r   input_framesfpsr   r   )r   r   r\   r   r   r3   r   r   r   r   r   r   r_   rU   VideoCaptureisOpenedr*   r   CAP_PROP_FRAME_COUNTr0   CAP_PROP_FPSr;   r<   r   CAP_PROP_POS_FRAMESreadrelease)r   r   ru   r   rA   r   r   r   r   captotalr   r   frames                 r>   preview_framer      s    TD999
 i
3z??C,<===?:??@@@##E**E5fUUUC$$f---UWZ[fWgWghhhJ HF:3DFFGGG

3z??
+
+C<<>> =;z;;<<<0116Q77E
())1T
2
2Cqyy!S[!1!1519==>>!S--..GGC#[111

IBKKMMM HFkFFFGGG&&EuM&QQQF	S%%v	.	.B A?+??@@@KWZjmnsjtjt  AD  EP  AQ  AQ  R  R  Rr@      detect_every
max_frames
int | Nonec           
        t          j        t          |                     }|                                st	          d|            |                    t           j                  pd}t          |                    t           j                            }	t          |                    t           j	                            }
t          |                    t           j
                  pd          }|j                            dd           |                    d          }t          j        d }t          j        t          |          |||	|
f          }|                                s&|                                 t	          d|           g }g }d}d}d}	 	 |                                \  }}|sn|||k    rn|t%          d	|          z  dk    s|s>|                    |          }t)          ||          }|}|d	z  }|t+          |          z  }t-          ||||
          }|                    |           |d	z  }|                                 |                                 n-# |                                 |                                 w xY wt1          | ||          }d||||||t          |          dS )Nr   r   r   Tr   z.silent.mp4mp4vzCannot create video writer: r:   r   r   )r   framesr   r   detection_framesr   audio_copiedr   )r   r   r3   r   r   r   r   r*   CAP_PROP_FRAME_WIDTHCAP_PROP_FRAME_HEIGHTr   r   r   with_suffixVideoWriter_fourccVideoWriterr   r   r;   r   r   r   r   writer   )r   r   ru   r   rA   r  r  r   r   r5   r6   r   	tmp_videofourccwriter
prev_boxescurrent_boxesr  r  total_detectionsr   r   detectedblurredr	  s                            r>   process_videor    s    
3z??
+
+C<<>> =;z;;<<<
''#"
#
#
+tC01122E23344F0116Q77ETD999''66I#V,F_S^^VS5&/JJF?? EC	CCDDDJ!MF	

IB %&J*>*>A|,,,111#..u55 ,Xz B B*
 A%  C$6$66  ][abbbGLL!!!aKF	  	 	%j)[IIL,&$k""	 	 	s   B)I+ +*J)rS   r   r7   rJ   )r4   r3   r7   rJ   )r   r   )
rw   rx   r   r   r   r*   rA   r0   r7   rx   )r   r   r   r   ru   rp   r   r*   rA   r0   r7   r   )r   r)   r   r)   r7   r0   )r   r   )
r   r   r   r   r   r0   r   r0   r7   ry   )r   r   r   r   r   r   r7   rJ   )r   r   r   )r   r   r   r   ru   rp   r   r*   rA   r0   r   r*   r7   r   )r   r   r  N)r   r   r   r   ru   rp   r   r*   rA   r0   r  r*   r  r  r7   r   )(
__future__r   mathosr   r   dataclassesr   pathlibr   typingr   r   r   r	   r   numpynpPILr
   nudenetr   	ExceptionrW   rX   rm   rl   r)   rZ   r\   r_   rn   rp   r   r   r   r   r   r   r  rR   r@   r>   <module>r$     s   " " " " " "  				      ! ! ! ! ! !       2 2 2 2 2 2 2 2 2 2 2 2 



          $$$$$$$   LLL 877
>>>
   ? ? ? ? ? ? ? ?:: : : :- - - -- - - -3 3 3 3       :    *
S 
S 
S 
S 
S+ + + +    :   6 (R (R (R (R (R^ !; ; ; ; ; ; ;s   A AA