
    ^(jX                        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	 d dl
mZmZmZmZmZmZmZmZmZmZ d dlmZmZmZmZmZmZmZmZmZ  G d dej>                        Z  G d	 d
ej>                        Z! G d dej>                        Z" G d dej>                        Z# G d dej>                        Z$de	jJ                  de&e	jN                  e	jP                  f   fdZ) G d dej>                        Z* G d de      Z+de+fdZ,y)    N)CodecContext)override)IOComfyExtensionInput)
BriaEditImageRequestBriaImageEditResponseBriaRemoveBackgroundRequestBriaRemoveBackgroundResponse BriaRemoveVideoBackgroundRequest!BriaRemoveVideoBackgroundResponseBriaStatusResponseBriaVideoGreenScreenRequest!BriaVideoReplaceBackgroundRequestInputModerationSettings)	ApiEndpointconvert_mask_to_imagedownload_url_to_image_tensordownload_url_to_video_outputpoll_opsync_opupload_image_to_comfyapiupload_video_to_comfyapivalidate_video_durationc                       e Zd Zed        Ze	 ddedej                  dedededed	e	d
ede
dej                  dz  dej                  fd       Zy)BriaImageEditNodec                    t        j                  ddddt         j                  j                  ddg      t         j                  j                  d      t         j
                  j                  d	d
dd      t         j
                  j                  dd
d      t         j
                  j                  dd
dd      t         j                  j                  dddddt         j                  j                  d
      t         j                  j                  dddddt         j                  j                  d      t         j                  j                  dddddt         j                  j                        t         j                  j                  d t         j                  j                  d!g       t         j                  j                  d"t         j                  j                  d#d$%      t         j                  j                  d&d$%      t         j                  j                  d'd
%      g      gd()      t         j                  j                  d*d+d
,      g
t         j                  j                         t         j
                  j                  d-      gt         j                  j                   t         j                  j"                  t         j                  j$                  gd
t        j&                  d./      0	      S )1Nr   zBria FIBO Image Editpartner/image/Briaz#Edit images using Bria latest modelmodelFIBO)optionsimagepromptT zInstruction to edit image)	multilinedefaulttooltipnegative_prompt)r%   r&   structured_promptzA string containing the structured edit prompt in JSON format. Use this instead of usual prompt for precise, programmatic control.seed   )r&   minmaxstepdisplay_modecontrol_after_generateguidance_scale      g{Gz?z<Higher value makes the image follow the prompt more closely.)r&   r-   r.   r/   r0   r'   steps2      )r&   r-   r.   r/   r0   
moderationfalsetrueprompt_content_moderationFr&   visual_input_moderationvisual_output_moderationModeration settingsr!   r'   maskz1If omitted, the edit applies to the entire image.)r'   optionaldisplay_namez{"type":"usd","usd":0.04}expr	node_idrD   categorydescriptioninputsoutputshiddenis_api_nodeprice_badge)r   SchemaCombor   ImageStringIntNumberDisplaynumberFloatDynamicComboOptionBooleanMaskOutputHiddenauth_token_comfy_orgapi_key_comfy_org	unique_id
PriceBadgeclss    D/Users/danicosta/Desktop/Flux2/ComfyUI/comfy_api_nodes/nodes_bria.pydefine_schemazBriaImageEditNode.define_schema"   s~   yy'/)=w9w'		"7	    		 1T2N		'"Z	    "!#!1!1!8!8+/   $!#!1!1!8!8Z   !#!1!1!8!8   %% ..w;.." "

 0 01LV[ 0 \ "

 0 01JTY 0 Z "

 0 01KUY 0 Z
 2 &  O!  u?B !		  .A B
 		..		++		##
 4_R
 R	
    Nr   r"   r#   r(   r)   r*   r2   r5   r8   rA   returnc                   K   |s|st        d      d }|
t        | t        |
      d       d {   }t        | t	        dd      t        |r|nd |r|nd t        | |d       d {   g||r|nd |||||	j                  dd	      |	j                  d
d	      |	j                  dd	            t               d {   }t        | t	        d|j                         d t               d {   }t        j                  t        |j                  j                         d {   |j                  j                         S 7 7 7 7 Z7 &w)Nz?One of prompt or structured_prompt is required to be non-empty.zUploading mask
wait_labelzproxy/bria/v2/image/editPOSTpathmethodUploading imager;   Fr=   r>   )instructionstructured_instructionimagesrA   r(   r2   r*   model_version	steps_numr;   visual_input_content_moderation visual_output_content_moderationdataresponse_model/proxy/bria/v2/status/rm   c                     | j                   S Nstatusrs    rd   <lambda>z+BriaImageEditNode.execute.<locals>.<lambda>       qxxrf   status_extractorry   )
ValueErrorr   r   r   r   r   getr   r   
request_idr	   r   
NodeOutputr   result	image_urlr)   )rc   r   r"   r#   r(   r)   r*   r2   r5   r8   rA   mask_urlresponses                rd   executezBriaImageEditNode.executex   sW     /^__5c;PQU;VcsttH 7G%&,F$<M'8SW6sEN_``a3B-#*4..9TV[*\0:?XZ_0`1;@Z\a1b .#
 
& !5h6I6I5JKL/0	
 
 }}.x/H/HIIOO--
 	
5 u a
&
 JsX   .EE6E'E(AE<E=2E/E
05E%E&EEE
EEr}   )__name__
__module____qualname__classmethodre   strr   rR   intfloatr   r   r   r    rf   rd   r   r       s    S
 S
j  $(.
.
 {{.
 	.

 .
 .
 .
 .
 .
 ,.
 kkD .
 
.
 .
rf   r   c            	       f    e Zd Zed        Zedej                  dedede	j                  fd       Zy)BriaRemoveImageBackgroundc                 *   t        j                  ddddt         j                  j                  d      t         j                  j                  dt         j                  j                  dg       t         j                  j                  dt         j                  j                  d	d
      t         j                  j                  dd      g      gd      t         j                  j                  ddddt         j                  j                  dd      gt         j                  j                         gt         j                  j                  t         j                  j                  t         j                  j                  gdt        j                  d      	      S )Nr   zBria Remove Image Backgroundr   z8Remove the background from an image using Bria RMBG 2.0.r"   r8   r9   r:   r=   Fr<   r>   Tr?   r@   r*   r   r,   _Seed controls whether the node should re-run; results are non-deterministic regardless of seed.r&   r-   r.   r0   r1   r'   z{"type":"usd","usd":0.018}rE   rG   )r   rP   rR   r   rX   rY   rZ   rT   rU   rV   r\   r]   r^   r_   r`   ra   rb   s    rd   re   z'BriaRemoveImageBackground.define_schema   sG   yy/7)Rw'%% ..w;.." "

 0 01JTY 0 Z "

 0 01KUY 0 Z	 2 &  "!#!1!1!8!8+/H  	!6 XX__&'		..		++		##
 5O*
 *	
rf   r"   r8   r*   rg   c                   K   t        | t        dd      t        t        | |d       d {   d|j	                  dd      |j	                  dd      |	      t
        
       d {   }t        | t        d|j                         d t               d {   }t        j                  t        |j                  j                         d {         S 7 7 s7 B7 w)Nz+/proxy/bria/v2/image/edit/remove_backgroundrk   rl   ro   ri   Fr=   r>   )r"   syncru   rv   r*   rw   rz   r{   c                     | j                   S r}   r~   r   s    rd   r   z3BriaRemoveImageBackground.execute.<locals>.<lambda>   r   rf   r   )r   r   r
   r   r   r   r   r   r   r   r   r   r   r   )rc   r"   r8   r*   r   s        rd   r   z!BriaRemoveImageBackground.execute   s      !JSYZ,4S%L]^^0:?XZ_0`1;@Z\a1b .
 
 !5h6I6I5JKL/7	
 
 }}#?@Y@Y#ZZ[[ _	

 [sE   )C C:C &C'2C C5C C	C C C C N)r   r   r   r   re   r   rR   dictr   r   r   r   r   rf   rd   r   r      s]    +
 +
Z \{{\ \ 	\
 
\ \rf   r   c            	       f    e Zd Zed        Zedej                  dedede	j                  fd       Zy)BriaRemoveVideoBackgroundc                 2   t        j                  ddddt         j                  j                  d      t         j                  j                  dg dd	      t         j
                  j                  d
dddt         j                  j                  dd      gt         j                  j                         gt         j                  j                  t         j                  j                  t         j                  j                  gdt        j                  d      	      S )Nr   zBria Remove Video Backgroundpartner/video/Briaz/Remove the background from a video using Bria. videobackground_color)
BlackWhiteGrayRedGreenBlueYellowCyanMagentaOrangez&Background color for the output video.r@   r*   r   r,   Tr   r   7{"type":"usd","usd":0.14,"format":{"suffix":"/second"}}rE   rG   r   rP   Videor   rQ   rT   rU   rV   r\   r]   r^   r_   r`   ra   rb   s    rd   re   z'BriaRemoveVideoBackground.define_schema   s    yy/7)Iw'& E    "!#!1!1!8!8+/H  	%: XX__&'		..		++		##
 RS,
 ,	
rf   r   r   r*   rg   c           
        K   t        |d       t        | t        dd      t        t	        | |       d {   |d|      t
               d {   }t        | t        d	|j                   
      d t               d {   }t        j                  t        |j                  j                         d {         S 7 7 s7 B7 w)N      N@max_duration+/proxy/bria/v2/video/edit/remove_backgroundrk   rl   mp4_h264r   r   output_container_and_codecr*   rw   rz   r{   c                     | j                   S r}   r~   r   s    rd   r   z3BriaRemoveVideoBackground.execute.<locals>.<lambda>>  r   rf   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   	video_url)rc   r   r   r*   r   s        rd   r   z!BriaRemoveVideoBackground.execute(  s      	 D9 JSYZ14S%@@!1+5	 .

 

 !5h6I6I5JKL/<	
 
 }}#?@Y@Y#ZZ[[ A	


 [E   4C
CC
C2C
C5C
9C:	C
C
C
C
Nr   r   r   r   re   r   r   r   r   r   r   r   r   rf   rd   r   r      s]    -
 -
^ \{{\ \ 	\
 
\ \rf   r   c            	       f    e Zd Zed        Zedej                  dedede	j                  fd       Zy)BriaVideoGreenScreenc                 2   t        j                  ddddt         j                  j                  d      t         j                  j                  dg dd	      t         j
                  j                  d
dddt         j                  j                  dd      gt         j                  j                         gt         j                  j                  t         j                  j                  t         j                  j                  gdt        j                  d      	      S )Nr   zBria Video Green Screenr   zGReplace a video's background with a solid chroma-key screen using Bria.r   green_shade)broadcast_greenchroma_greenblue_screenzSolid chroma-key shade applied behind the foreground: broadcast_green (#00B140), chroma_green (#00FF00), or blue_screen (#0000FF).r@   r*   r   r,   Tr   r   r   rE   rG   r   rb   s    rd   re   z"BriaVideoGreenScreen.define_schemaF  s    yy*2)aw'!Nc   "!#!1!1!8!8+/H  	& XX__&'		..		++		##
 R?"
 "	
rf   r   r   r*   rg   c           
        K   t        |d       t        | t        dd      t        t	        | |       d {   |d|      t
               d {   }t        | t        d	|j                   
      d t               d {   }t        j                  t        |j                  j                         d {         S 7 7 s7 B7 w)Nr   r   z&/proxy/bria/v2/video/edit/green_screenrk   rl   r   )r   r   r   r*   rw   rz   r{   c                     | j                   S r}   r~   r   s    rd   r   z.BriaVideoGreenScreen.execute.<locals>.<lambda>  r   rf   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   )rc   r   r   r*   r   s        rd   r   zBriaVideoGreenScreen.executel  s      	 D9 EfU,4S%@@'+5	 .

 

 !5h6I6I5JKL/<	
 
 }}#?@Y@Y#ZZ[[ A	


 [r   Nr   r   rf   rd   r   r   D  s]    #
 #
J \{{\ \ 	\
 
\ \rf   r   c                       e Zd Zed        Ze	 	 d	dej                  dedej                  dz  dej                  dz  de	j                  f
d       Zy)
BriaVideoReplaceBackgroundc                 t   t        j                  ddddt         j                  j                  dd      t         j                  j                  dd	d
      t         j                  j                  dd	d      t         j
                  j                  ddddt         j                  j                  d	d      gt         j                  j                         gt         j                  j                  t         j                  j                  t         j                  j                  gd	t        j                  d      	      S )Nr   zBria Video Replace Backgroundr   zReplace a video's background with a supplied image or video using Bria. The output keeps the foreground's resolution and frame rate; a background with a different aspect ratio is stretched to fit, so match it for undistorted results.r   z.Foreground video whose background is replaced.)r'   background_imageTzwBackground image to composite behind the foreground. Provide either a background image or a background video, not both.)rB   r'   background_videozwBackground video to composite behind the foreground. Provide either a background image or a background video, not both.r*   r   r,   r   r   r   rE   rG   )r   rP   r   r   rR   rT   rU   rV   r\   r]   r^   r_   r`   ra   rb   s    rd   re   z(BriaVideoReplaceBackground.define_schema  s   yy08)_ w0`a&!Y   &!Y   "!#!1!1!8!8+/H  	2 XX__&'		..		++		##
 RO*
 *	
rf   Nr   r*   r   r   rg   c           
      @  K   |d u |d u k(  rt        d      t        |d       |$t        |d       t        | |d       d {   }nt        | |d       d {   }t	        | t        dd      t        t        | |       d {   |d	|
      t               d {   }t        | t        d|j                         d t               d {   }t        j                  t        |j                  j                         d {         S 7 7 7 7 w7 F7 w)NzBProvide either a background image or a background video, not both.r   r   zUploading backgroundri   z,/proxy/bria/v2/video/edit/replace_backgroundrk   rl   r   )r   background_urlr   r*   rw   rz   r{   c                     | j                   S r}   r~   r   s    rd   r   z4BriaVideoReplaceBackground.execute.<locals>.<lambda>  r   rf   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )rc   r   r*   r   r   r   r   s          rd   r   z"BriaVideoReplaceBackground.execute  s"     $*:d*BCabbD9'#$44H#;CAQ^t#uuN#;CAQ^t#uuN KTZ[24S%@@-+5	 .

 

 !5h6I6I5JKL/<	
 
 }}#?@Y@Y#ZZ[[) vu
 A	


 [sl   ADDDD*DDD D!2DD5D	D
	DDDDDD)NN)r   r   r   r   re   r   r   r   rR   r   r   r   r   rf   rd   r   r     s    +
 +
Z 
 04/3 \{{ \  \  ++,	 \
  ++, \ 
 \  \rf   r   r   rg   c           	      8   g }g }t        j                  | j                         d      5 }|j                  j                  d   }|j
                  j                  dk(  rt        j                  dd      nd}|j                  |      D ]  }||j                  |      n|j                         D ]d  }t        j                  |j                  d            j                         d	z  }|j                  |d
ddf          |j                  |d          f  	 ddd       |rt        j                   |      nt        j"                  dddd      }	|rdt        j                   |      z
  n$t        j"                  |	j$                  d   ddf      }
|	|
fS # 1 sw Y   {xY w)a`  Decode a transparent webm (VP9 + alpha) into image frames and an alpha mask.

    VP9 keeps its alpha in a side layer that PyAV's default vp9 decoder drops, so the frames
    are decoded with libvpx-vp9. Returns RGB images [B,H,W,3] in 0..1 and a mask [B,H,W]
    following the Load Image convention (1 = transparent) for compositing or Save WEBM.
    r   )moder   vp9z
libvpx-vp9Nrgba)formatg     o@.r3   ).r3   g      ?@   )avopenget_stream_sourcestreamsr   codec_contextnamer   createdemuxdecodetorch
from_numpy
to_ndarrayr   appendstackzerosshape)r   
rgb_framesalpha_frames	containerstreamdecoderpacketframer   rr   rA   s              rd   _video_to_images_and_maskr     sc    &(J')L	((*	5""((+<B<P<P<U<UY^<^,%%lC8dhoof-F4;4G'..0V]]_\''(8(8(8(GHNNPSXX!!$sBQBw-0##DL1 ] . 
6 )3U[[$Aq!Q8OF0<C%++l++%++v||\]`bdfNgBhD4< 
6	5s   C+FFc                   b    e Zd Zed        Zedej                  dedej                  fd       Z
y)BriaTransparentVideoBackgroundc                 .   t        j                  ddddt         j                  j                  d      t         j                  j                  ddddt         j
                  j                  d	d
      gt         j                  j                  d      t         j                  j                  d      gt         j                  j                  t         j                  j                  t         j                  j                  gd	t        j                  d      	      S )Nr   z*Bria Remove Video Background (Transparent)r   zRemove the background from a video using Bria and return the cut-out frames plus an alpha mask. Connect both to a compositing node, or feed them to Save WEBM to write a transparent video.r   r*   r   r,   Tr   r   rr   rC   rA   r   rE   rG   )r   rP   r   r   rT   rU   rV   rR   r\   r[   r]   r^   r_   r`   ra   rb   s    rd   re   z,BriaTransparentVideoBackground.define_schema  s    yy4E)) w'"!#!1!1!8!8+/H  	 X6F3
 		..		++		##
 R=!
 !	
rf   r   r*   rg   c           
        K   t        |d       t        | t        dd      t        t	        | |       d {   dd|      t
        	       d {   }t        | t        d
|j                         d t               d {   }t        |j                  j                         d {   }t        |      \  }}t        j                  ||      S 7 7 7 S7 .w)Nr   r   r   rk   rl   Transparentwebm_vp9r   rw   rz   r{   c                     | j                   S r}   r~   r   s    rd   r   z8BriaTransparentVideoBackground.execute.<locals>.<lambda>.  r   rf   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )rc   r   r*   r   	video_outrr   rA   s          rd   r   z&BriaTransparentVideoBackground.execute  s      	 D9 JSYZ14S%@@!.+5	 .

 

 !5h6I6I5JKL/<	
 
 7x7P7PQQ	0;}}VT** A	


 RsE   4CCCC2CC&C*C+)CCCCN)r   r   r   r   re   r   r   r   r   r   r   r   rf   rd   r   r     sM    "
 "
H +{{+ + 
	+ +rf   r   c                   B    e Zd Zedeeej                        fd       Zy)BriaExtensionrg   c                 @   K   t         t        t        t        t        gS wr}   )r   r   r   r   r   )selfs    rd   get_node_listzBriaExtension.get_node_list7  s!      %% *
 	
s   N)	r   r   r   r   listtyper   	ComfyNoder   r   rf   rd   r   r   6  s)    
T$r||*<%= 
 
rf   r   c                     K   t               S wr}   )r   r   rf   rd   comfy_entrypointr   C  s     ?s   )-r   r   av.codecr   typing_extensionsr   comfy_api.latestr   r   r   comfy_api_nodes.apis.briar   r	   r
   r   r   r   r   r   r   r   comfy_api_nodes.utilr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   tuplerR   r[   r   r   r   r   r   rf   rd   <module>r     s    	  ! & 6 6  
 
 
G
 G
TI\ I\XK\ K\\A\2<< A\HQ\ Q\hU[[ U5;;

;R5S ,A+R\\ A+H

N 

 rf   