o
    iP                     @   s<  d dl 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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Zde de fd	d
Z!de"de"de"de fddZ#G dd dej$Z%G dd dej$Z&G dd dej$Z'G dd dej$Z(G dd dej$Z)G dd deZ*de*fddZ+dS )    N)override)IOComfyExtensionInput)#ImageRelightAdvancedSettingsRequestImageRelightRequest ImageSkinEnhancerCreativeRequest ImageSkinEnhancerFaithfulRequest ImageSkinEnhancerFlexibleRequestImageStyleTransferRequestImageUpscalerCreativeRequestImageUpscalerPrecisionV2RequestInputAdvancedSettingsInputPortraitModeInputSkinEnhancerModeTaskResponse)
ApiEndpointdownload_url_to_image_tensordownscale_image_tensorget_image_dimensionsget_number_of_imagespoll_opsync_opupload_images_to_comfyapivalidate_image_aspect_ratiovalidate_image_dimensionsg
ףp=
?
megapixelsreturnc                 C   s(   | dkrdS | dkrdS | dkrdS dS )zLPrice in EUR for a single Magnific upscaling step based on input megapixels.g?gM?g      @gM?g@g~jt?g~jt? )r   r   r   </mnt/c/Users/fbmor/ComfyUI/comfy_api_nodes/nodes_magnific.py_tier_price_eur$   s   r    widthheightscalec                 C   sN   t t|}d}| | }t|D ]}|t|d 7 }|d9 }qt|t dS )zZCalculate total Magnific upscale price in USD for given input dimensions and scale factor.g        i@B       )intmathlog2ranger    round_EUR_TO_USD)r!   r"   r#   	num_steps	total_eurpixels_r   r   r   %_calculate_magnific_upscale_price_usd/   s   
r0   c                   @   sV   e Zd Zedd Zedejdededededed	ed
edede	de
jfddZdS )!MagnificImageUpscalerCreativeNodec                 C   s  t jddddt jdt jjdddd	t jjd
g ddt jjdg ddt jj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dt jjdddddt jjdt jjdg dddt j	jddd dd!g
t j
 gt jjt jjt jjgdt jt jd
dgd"d#d$d%	S )&Nr1   z!Magnific Image Upscale (Creative)api node/image/Magnificuf   Prompt‑guided enhancement, stylization, and 2x/4x/8x/16x upscaling. Maximum output: 25.3 megapixels.imagepromptT 	multilinedefaultscale_factor2x4x8x16xoptionsoptimized_for)	standardsoft_portraitshard_portraitsart_n_illustrationvideogame_assetsnature_n_landscapesfilms_n_photography
3d_rendersscience_fiction_n_horror
creativityi
   r   )minmaxr8   display_modehdrz#The level of definition and detail.rM   rN   r8   tooltiprO   resemblancez/The level of resemblance to the original image.
fractalityz:The strength of the prompt and intricacy per square pixel.engine)	automaticmagnific_illusiomagnific_sharpymagnific_sparkle)r@   advancedauto_downscaleFzOAutomatically downscale input image if output would exceed maximum pixel limit.r8   rR   rZ   widgetsa  
                (
                  $ad := widgets.auto_downscale;
                  $mins := $ad
                    ? {"2x": 0.172, "4x": 0.343, "8x": 0.515, "16x": 0.515}
                    : {"2x": 0.172, "4x": 0.343, "8x": 0.515, "16x": 0.844};
                  $maxs := {"2x": 0.515, "4x": 0.844, "8x": 1.015, "16x": 1.187};
                  {
                    "type": "range_usd",
                    "min_usd": $lookup($mins, widgets.scale_factor),
                    "max_usd": $lookup($maxs, widgets.scale_factor),
                    "format": { "approximate": true }
                  }
                )
                
depends_onexpr	node_iddisplay_namecategorydescriptioninputsoutputshiddenis_api_nodeprice_badge)r   SchemaImager   StringComboIntNumberDisplaysliderBooleanOutputHiddenauth_token_comfy_orgapi_key_comfy_org	unique_id
PriceBadgePriceBadgeDependsclsr   r   r   define_schema;   sz   
8z/MagnificImageUpscalerCreativeNode.define_schemar3   r4   r9   rA   rK   rP   rS   rT   rU   r[   r   c                    s  t |dkrtdt|dddd t|ddd d	}t|\}}t|d
}|| | | }||kr|
r|| }d}|d }dD ],}||krJqC|| | }||krZ|}d } nt|| }|dkro|}|||  } nqC|d urzt	||d}| d
}ntd||  d
||  d|dd|dd	t|\}}t|d
}t
||| t| tdddttt| |dd dI d H d |||||||	|r|nd d	dI d H }t| td|j dtdd  fd dd!d"d#I d H }tt|jd I d H S )$N   $Exactly one input image is required.r~      r   r~   Fstrict   
min_height	min_widthi xr%   r$         r$   r%          @total_pixelszOutput size (z = ,z) pixels) exceeds maximum allowed size of 9 pixels. Use a smaller input image or lower scale factor.z#/proxy/freepik/v1/ai/image-upscalerPOSTpathmethod
max_imagesr   r   )	r3   r9   rA   rK   rP   rS   rT   rU   r4   response_modeldataz$/proxy/freepik/v1/ai/image-upscaler/r   c                 S      | j S Nstatusr   r   r   r   <lambda>       z;MagnificImageUpscalerCreativeNode.execute.<locals>.<lambda>c                        S r   r   r/   	price_usdr   r   r                $@  r   status_extractorprice_extractorpoll_intervalmax_poll_attempts)r   
ValueErrorr   r   r   r&   rstripr'   sqrtr   r0   r   r   r   r   r   r   task_idr   
NodeOutputr   	generated)r|   r3   r4   r9   rA   rK   rP   rS   rT   rU   r[   max_output_pixelsr"   r!   requested_scaleoutput_pixelsinput_pixelsr#   max_input_pixels	candidatescale_output_pixelsdownscale_ratiofinal_heightfinal_widthactual_scaleinitial_resfinal_responser   r   r   execute   s   


	z)MagnificImageUpscalerCreativeNode.executeN__name__
__module____qualname__classmethodr}   r   rm   strr&   boolr   r   r   r   r   r   r   r1   :   s6    
[	
r1   c                   @   sJ   e Zd Zedd Zedejdededededed	e	d
e
jfddZdS )"MagnificImageUpscalerPreciseV2Nodec                 C   s   t jddddt jdt jjdg ddt jjd	g 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dt jjdddddgt j	 gt j
jt j
jt j
jgdt jt jdgdddd 	S )!Nr   z#Magnific Image Upscale (Precise V2)r2   uq   High-fidelity upscaling with fine control over sharpness, grain, and detail. Maximum output: 10060×10060 pixels.r3   r9   r:   r?   flavor)sublimephotophoto_denoiserzbProcessing style: sublime for general use, photo for photographs, photo_denoiser for noisy photos.r@   rR   sharpenr   d      zNImage sharpness intensity. Higher values increase edge definition and clarity.rQ   smart_grainzaIntelligent grain/texture enhancement to prevent the image from looking too smooth or artificial.ultra_detail   zIControls fine detail, textures, and micro-details added during upscaling.r[   FzNAutomatically downscale input image if output would exceed maximum resolution.Tr\   r]   a  
                (
                  $mins := {"2x": 0.172, "4x": 0.343, "8x": 0.515, "16x": 0.844};
                  $maxs := {"2x": 2.045, "4x": 2.545, "8x": 2.889, "16x": 3.06};
                  {
                    "type": "range_usd",
                    "min_usd": $lookup($mins, widgets.scale_factor),
                    "max_usd": $lookup($maxs, widgets.scale_factor),
                    "format": { "approximate": true }
                  }
                )
                r_   rb   )r   rl   rm   r   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   ry   rz   r{   r   r   r   r}      sn   
	*z0MagnificImageUpscalerPreciseV2Node.define_schemar3   r9   r   r   r   r   r[   r   c                    s  t |dkrtdt|dddd t|ddd d	}t|\}	}
t|d
}|
| }|	| }||ks9||kr|rt|
|	}d}|d }|| }t|
|	 | | }dD ]3}||kr]qV|| }||krk|}d } n|| }|dkr|}|| }|| }t|
|	 | | } nqV|d urt||d}|}ntd| d
| d| d
| d	t|\}}t	||| t
| tdddttt| |dd dI d H d |||||ddI d H }t| td|j dtdd  fddddd I d H }tt|jd I d H S )!Nr~   r   r   r   Fr   r   r   iL'  r   r%   r   r   r   zOutput dimensions (z') exceed maximum allowed resolution of r   z0/proxy/freepik/v1/ai/image-upscaler-precision-v2r   r   r   r   )r3   r9   r   r   r   r   r   z1/proxy/freepik/v1/ai/image-upscaler-precision-v2/r   c                 S   r   r   r   r   r   r   r   r     r   z<MagnificImageUpscalerPreciseV2Node.execute.<locals>.<lambda>c                    r   r   r   r   r   r   r   r     r   r   r   r   )r   r   r   r   r   r&   striprN   r   r0   r   r   r   r   r   r   r   r   r   r   r   )r|   r3   r9   r   r   r   r   r[   max_output_dimensionr"   r!   r   output_widthoutput_heightmax_dimr#   max_input_dimscale_ratior   r   
output_dimr   r   r   r   r   r   r   r   r   :  s   


	z*MagnificImageUpscalerPreciseV2Node.executeNr   r   r   r   r   r      s*    
J	r   c                   @   sT   e Zd Zedd Zedejdejdedededed	ed
e	de
dejfddZdS )MagnificImageStyleTransferNodec                 C   s*  t jdd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dddt jjdt jjdddddt jjdt jjdg dddt jjdg ddddt j	jdt j	
dg t j	
d t jjd!g d"d#dt jjd$g d%d&dggd'dt jjd(dd)dd*g	t j gt jjt jjt jjgdt jd+d,d-	S ).Nr   zMagnific Image Style Transferr2   z>Transfer the style from a reference image to your input image.r3   z%The image to apply style transfer to.rR   reference_imagez*The reference image to extract style from.r4   Tr5   r6   style_strengthr   r   zPercentage of style strength.rQ   structure_strength2   z.Maintains the structure of the original image.r   )faithfulgen_zpsychedeliadetailyclear
donotstyledonotstyle_sharpzStyle transfer flavor.r   rU   )	balanceddefinioillusio
3d_cartooncolorful_anime
caricaturereal
super_realsoftyProcessing engine selection.)r@   rR   rZ   portrait_modedisabledenabledportrait_style)rB   pop	super_popz(Visual style applied to portrait images.portrait_beautifier)nonebeautify_facebeautify_face_maxz-Facial beautification intensity on portraits.z-Enable portrait mode for facial enhancements.fixed_generationzlWhen disabled, expect each generation to introduce a degree of randomness, leading to more diverse outcomes.r\   {"type":"usd","usd":0.11}ra   rb   )r   rl   rm   r   rn   rp   rq   rr   ro   DynamicComboOptionrs   rt   ru   rv   rw   rx   ry   r{   r   r   r   r}     s   Hz,MagnificImageStyleTransferNode.define_schemar3   r   r4   r   r   r   rU   r   r   r   c
                    sH  t |dkrtdt |dkrtdt|dddd t|dddd t|ddd	 t|ddd	 |d
 dk}
|dd}|dd}t| ||gddI d H }t| tdddtt	|d |d |rd|nd |||
|
rl|nd |
ru|dkru|nd |||	ddI d H }t
| td|j dtdd dddI d H }tt|jd I d H S )Nr~   r   (Exactly one reference image is required.r   r   Fr   r   r   r   r   r   rB   r   r   r%   r   z)/proxy/freepik/v1/ai/image-style-transferr   r   r   )r3   r   r4   r   r   is_portraitr   r   r   rU   r   r   z*/proxy/freepik/v1/ai/image-style-transfer/r   c                 S   r   r   r   r   r   r   r   r     r   z8MagnificImageStyleTransferNode.execute.<locals>.<lambda>r   r   r   r   r   r   )r   r   r   r   getr   r   r   r   r   r   r   r   r   r   r   )r|   r3   r   r4   r   r   r   rU   r   r   r  r   r   uploaded_urlsr   r   r   r   r   r     sP   


z&MagnificImageStyleTransferNode.executeN)r   r   r   r   r}   r   rm   r   r&   r   r   r   r   r   r   r   r   r   r     s2    
[	
r   c                   @   s\   e Zd Zedd Ze	ddejdededede	d	e	d
e	de
dejdB dejfddZdS )MagnificImageRelightNodec                 C   s  t jddddt jjdddt jjdd	d
ddt jjdddddt jjdt jjdg dddt j	jdddd	dt j	jdd	dd	dt j	jdd	dd	dt j
jdt j
dg t 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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dt jjd,g d-d.dt jjd/g d0d1dt jjd2g d3d4dt j	jd5d	d6d7g	gd8dt jjd9d	d:d;g	t j gt jjt jjt jjgd	t jd<d=d>	S )?Nr
  zMagnific Image Relightr2   zWRelight an image with lighting adjustments and optional reference-based light transfer.r3   zThe image to relight.r   r4   Tr5   zFDescriptive guidance for lighting. Supports emphasis notation (1-1.4).)r7   r8   rR   light_transfer_strengthr   r   z(Intensity of light transfer application.rQ   style)rB   darker_but_realisticcleansmoothbrightercontrasted_n_hdrjust_compositionzStylistic output preference.r   interpolate_from_originalFz<Restricts generation freedom to match original more closely.r\   change_backgroundz.Modifies background based on prompt/reference.preserve_detailsz1Maintains texture and fine details from original.advanced_settingsr   r   whitesr   z)Adjusts the brightest tones in the image.blacksz'Adjusts the darkest tones in the image.
brightnesszOverall brightness adjustment.contrastzContrast adjustment.
saturationzColor saturation adjustment.rU   )	rV   r   coolr   r   fairyr   hard_transformr   r   transfer_light_a)rV   lowmediumnormalhighhigh_on_facesz The intensity of light transfer.transfer_light_b)rV   compositionstraight	smooth_in
smooth_outsmooth_bothreverse_bothsoft_insoft_outsoft_midstyle_shiftstrong_shiftzeAlso modifies light transfer intensity. Can be combined with the previous control for varied effects.r   z1Ensures consistent output with the same settings.)r8   rR   z2Fine-tuning options for advanced lighting control.r   z3Optional reference image to transfer lighting from.)optionalrR   r   r  rb   )r   rl   rm   r   rn   rp   rq   rr   ro   rs   r  r  rt   ru   rv   rw   rx   ry   r{   r   r   r   r}   &  s
  	]a   z&MagnificImageRelightNode.define_schemaNr3   r4   r  r  r  r  r  r  r   r   c
                    s  t |dkrtd|	d urt |	dkrtdt|dddd t|ddd	 |	d ur;t|	dddd t|	ddd	 t| |dd
I d H d }
d }|	d urYt| |	dd
I d H d }d }|d dkrt|d |d |d |d |d |d |d |d |d d	}t| tdddtt	|
|r|nd |||||||d	dI d H }t
| td|j dtdd  d!d"d#I d H }tt|jd I d H S )$Nr~   r   r  r   r   Fr   r   r   r  r   r  r   r  r  r  r  r  rU   r  r%  r   )	r  r  r  r  r  rU   r  r%  r   z"/proxy/freepik/v1/ai/image-relightr   r   )	r3   r4   #transfer_light_from_reference_imager  r  r  r  r  r  r   z#/proxy/freepik/v1/ai/image-relight/r   c                 S   r   r   r   r   r   r   r   r     r   z2MagnificImageRelightNode.execute.<locals>.<lambda>r   r   r  )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r|   r3   r4   r  r  r  r  r  r  r   	image_urlreference_urladv_settingsr   r   r   r   r   r     sh   

z MagnificImageRelightNode.executer   )r   r   r   r   r}   r   rm   r   r&   r   r   r   r   r   r   r   r   r   r
  %  s6    
 +	
r
  c                   @   s>   e Zd Zedd Zedejdededede	j
f
dd	Zd
S )MagnificImageSkinEnhancerNodec                 C   s   t jddddt jj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t jdg t jdt jjdd	d
ddt jjdgt jdt j	jdg dddggddgt j
 gt jjt jjt jjgdt jt jdgdddd 	S )!Nr6  zMagnific Image Skin Enhancerr2   z>Skin enhancement for portraits with multiple processing modes.r3   zThe portrait image to enhance.r   r   r   r   zSharpening intensity level.rQ   r   r%   zSmart grain intensity level.modecreativer   skin_detailP   zSkin detail enhancement level.flexiblerA   )enhance_skinimprove_lightingenhance_everythingtransform_to_real
no_make_upz Enhancement optimization target.r   zProcessing mode: creative for artistic enhancement, faithful for preserving original appearance, flexible for targeted optimization.Tr]   z
                (
                  $rates := {"creative": 0.29, "faithful": 0.37, "flexible": 0.45};
                  {"type":"usd","usd": $lookup($rates, widgets.mode)}
                )
                r_   rb   )r   rl   rm   r   rp   rq   rr   r  r  ro   rt   ru   rv   rw   rx   ry   rz   r{   r   r   r   r}     s|    :z+MagnificImageSkinEnhancerNode.define_schemar3   r   r   r7  r   c                    s  t |dkrtdt|dddd t|ddd t| |dd	d
I d H d }|d }|dkr9d}t|||d}n|dkrJd}t||||d d}nd}t||||d d}t| t	d| ddt
|dI d H }	t| t	d|	j dt
dd dddI d H }
tt|
jd I d H S )Nr~   r   r   r   Fr   r   r   i   r   r   r7  r8  )r3   r   r   r   r9  )r3   r   r   r9  r;  rA   )r3   r   r   rA   z#/proxy/freepik/v1/ai/skin-enhancer/r   r   r   r   c                 S   r   r   r   r   r   r   r   r     r   z7MagnificImageSkinEnhancerNode.execute.<locals>.<lambda>r   r   r  )r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   )r|   r3   r   r   r7  r3  selected_modeendpointr   r   r   r   r   r   r   k  sX   z%MagnificImageSkinEnhancerNode.executeN)r   r   r   r   r}   r   rm   r&   r   r   r   r   r   r   r   r   r6    s    
Sr6  c                   @   s(   e Zd Zedeeej  fddZdS )MagnificExtensionr   c                    s   t ttttgS r   )r1   r   r   r
  r6  )selfr   r   r   get_node_list  s   zMagnificExtension.get_node_listN)	r   r   r   r   listtyper   	ComfyNoderE  r   r   r   r   rC    s    rC  c                      s   t  S r   )rC  r   r   r   r   comfy_entrypoint  s   rI  ),r'   typing_extensionsr   comfy_api.latestr   r   r   comfy_api_nodes.apis.magnificr   r   r   r	   r
   r   r   r   r   r   r   r   comfy_api_nodes.utilr   r   r   r   r   r   r   r   r   r   r+   floatr    r&   r0   rH  r1   r   r   r
  r6  rC  rI  r   r   r   r   <module>   s(    80 5 "  r 