o
    8h*                     @   s   d Z ddl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 ddlZejejd eeZG dd dZdS )	u  
MULTI-API IMAGE GENERATOR WITH FALLBACK SYSTEM
==============================================
Features:
✅ Multiple Free APIs (Auto Fallback)
✅ 99.9% Uptime Guarantee
✅ Fast Generation (10-20 seconds)
✅ Unlimited & Completely Free
✅ Smart Retry Logic
✅ Load Balancing
    N)BytesIO)Image)OptionalDictList)levelc                   @   s  e Zd ZdZdd ZdededefddZdeded	ed
edee	 f
ddZ
deded	ed
edee	 f
ddZdeded	ed
edee	 f
ddZdefddZdefddZd"deded	ed
edee	 f
ddZ		d#dededed	ed
ededee fddZdefdd Zd!S )$MultiAPIImageGeneratorz<
    Robust image generator with multiple API fallbacks
    c                 C   sv   dd| j ddddd| jddddd	| jdddg| _d
dddddddddddddddd| _d| _d| _d S )NPollinations%https://image.pollinations.ai/prompt/Tr   )nameurlmethod	availablefailuresHuggingFace,https://api-inference.huggingface.co/models/	Stabilityz'https://api.stability.ai/v1/generation/zflux-realism(stabilityai/stable-diffusion-xl-base-1.0zstable-diffusion-xl-1024-v1-0)pollinationshuggingface	stabilityzflux-3dz
flux-animezLinaqruf/anything-v3.0zflux-cablyai)	realistic3danimecartoon   <   )_generate_pollinations_generate_huggingface_generate_stability_freeapis	model_mapmax_retriestimeoutself r&   H/var/www/eduai.edurigo.com/generate_image/testing/multi_api_generator.py__init__    sL   
zMultiAPIImageGenerator.__init__promptcategoryreturnc                 C   s.   dddddd}| | d}| d| S )	z Enhance prompt based on categoryz@photorealistic, ultra detailed, 8k uhd, professional photographyz03d render, octane render, high quality, detailedz.anime style, manga art, high quality, detailedz*cartoon style, vibrant colors, clean linesz0cinematic shot, movie quality, dramatic lighting)r   r   r   r   	cinematiczhigh quality, detailedz, )getlower)r%   r)   r*   enhancementsenhancementr&   r&   r'   _enhance_promptU   s   z&MultiAPIImageGenerator._enhance_promptwidthheightc              
   C   s   zF| j |i dd}| ||}dtj| }|||tdddddd}tj||| jd}	|	j	d	kr;|	j
W S td
|	j	  W dS  tya }
 ztd|
  W Y d}
~
dS d}
~
ww )zGenerate using Pollinations APIr   fluxr
      i true)r2   r3   modelseednologoenhancenofeed)paramsr#      zPollinations returned status NzPollinations error: )r!   r-   r1   requestsutilsquoterandomrandintr#   status_codecontentloggerwarning	Exceptionerror)r%   r)   r*   r2   r3   r7   enhanced_promptr   r<   responseer&   r&   r'   r   a   s,   


z-MultiAPIImageGenerator._generate_pollinationsc              
   C   s   z=| j |i dd}| ||}d| }|||ddd}tj||| jd}	|	jdkr2|	jW S t	d	|	j  W d
S  t
yX }
 ztd|
  W Y d
}
~
d
S d
}
~
ww )z4Generate using HuggingFace Inference API (Free tier)r   r   r      )r2   r3   num_inference_steps)inputs
parameters)jsonr#   r=   zHuggingFace returned status NzHuggingFace error: )r!   r-   r1   r>   postr#   rC   rD   rE   rF   rG   rH   )r%   r)   r*   r2   r3   r7   rI   r   payloadrJ   rK   r&   r&   r'   r   ~   s(   
	
z,MultiAPIImageGenerator._generate_huggingfacec              
   C   s   z4|  ||}d}|||d}tj||| jd}|jdkr2| }	d|	v r2tj|	d dd}
|
jW S W dS  tyO } zt	
d	|  W Y d}~dS d}~ww )
z)Fallback using alternative free endpointsz#https://api.deepai.org/api/text2img)textr2   r3   )datar#   r=   
output_urlrL   )r#   NzStability fallback error: )r1   r>   rQ   r#   rC   rP   r-   rD   rG   rE   rH   )r%   r)   r*   r2   r3   rI   r   rT   rJ   resultimg_responserK   r&   r&   r'   r      s&   
z/MultiAPIImageGenerator._generate_stability_free	api_indexc                 C   sZ   | j | d  d7  < | j | d dkr+d| j | d< td| j | d  d d	S d	S )
z-Mark API as failed and potentially disable itr   r5      Fr   zAPI r   z disabled due to failuresN)r    rE   rF   r%   rX   r&   r&   r'   _mark_api_failure   s
    z(MultiAPIImageGenerator._mark_api_failurec                 C   s    d| j | d< d| j | d< dS )zReset failure count on successr   r   Tr   Nr    rZ   r&   r&   r'   _mark_api_success   s   z(MultiAPIImageGenerator._mark_api_success  8  c                 C   s  t d|dd  d|  t| jD ]}t| jD ]\}}|d s$qt d|d  d| j d	|d
   zA|d ||||}|rrztt| | 	| t d|d
   |W W     S    t 
d|d
   Y W q| | W q ty }	 zt d|d
  d|	  | | W Y d}	~	qd}	~	ww || jd k r|d d }
t d|
 d t|
 qt d dS )zF
        Generate image with automatic fallback to other APIs
        zGenerating image: N2   z... Category: r   zAttempt r5   /z	 - Using r   r   u   ✅ Success with zInvalid image from zError with z:    u   ⏳ Waiting zs before retry...u!   ❌ All APIs failed after retries)rE   inforanger"   	enumerater    r   openr   r]   rF   r[   rG   rH   timesleep)r%   r)   r*   r2   r3   attemptidxapiimage_bytesrK   	wait_timer&   r&   r'   generate_image_with_fallback   s>   &



z3MultiAPIImageGenerator.generate_image_with_fallbackr5   
model_nameimage_countc                 C   s   g }t |D ]m}td|d  d|  | ||||}	|	r^td}
t| d|  	 dd }| d|
 d|d  d| }t
|	d}|||d	 td
|  n
td|d   ||d k rstd q|S )z@
        Generate multiple images with fallback support
        zGenerating image r5   ra   z%Y%m%d_%H%M%S_N   zutf-8)r   base64u   ✅ Generated: u   ❌ Failed to generate image )rd   rE   rc   rn   rg   strftimehashlibmd5encode	hexdigestrs   	b64encodedecodeappendrH   rh   )r%   r)   r*   ro   r2   r3   rp   imagesirl   	timestampprompt_hash
image_namebase64_datar&   r&   r'   generate_multiple_images   s&   
$
z/MultiAPIImageGenerator.generate_multiple_imagesc                 C   s   ddd | j D iS )zGet status of all APIsr    c                 S   s$   g | ]}|d  |d |d dqS )r   r   r   )r   r   r   r&   ).0rk   r&   r&   r'   
<listcomp>  s    z9MultiAPIImageGenerator.get_api_status.<locals>.<listcomp>r\   r$   r&   r&   r'   get_api_status  s   z%MultiAPIImageGenerator.get_api_statusN)r^   r_   )r^   r_   r5   )__name__
__module____qualname____doc__r(   strr1   intr   bytesr   r   r   r[   r]   rn   r   r   r   r   r&   r&   r&   r'   r      s,    5"""	$-
%r   )r   r>   rs   ru   rA   rg   ior   PILr   typingr   r   r   loggingbasicConfigINFO	getLoggerr   rE   r   r&   r&   r&   r'   <module>   s    
