a
    Ad                     @   s   d dl Z d dlZd dlZd dlZd dlmZmZ d dlm	Z	 d dlm
Z
 dai Zg Zg ZdZdd Zdd Zd	d
 Zdd ZG dd deZG dd deZdd ZedddZdd ZdS )    N)	BaseModelField)opts   c                 C   s   | a t| d  d S N)current_taskpending_taskspopid_task r   8/var/www/html/stable-diffusion-webui/modules/progress.py
start_task   s    r   c                 C   s0   t | krd a t|  ttdkr,td d S )N   r   )r   finished_tasksappendlenr	   r
   r   r   r   finish_task   s
    
r   c                 C   s(   t | |f tt tkr$t d d S )Nr   )recorded_resultsr   r   recorded_results_limitr	   r   resr   r   r   record_results&   s    r   c                 C   s   t   t| < d S r   )timer   )Zid_jobr   r   r   add_task_to_queue,   s    r   c                   @   sP   e Zd ZU eddddZeed< eddddZeed	< ed
dddZ	e
ed< dS )ProgressRequestNzTask IDz"id of the task to get progress fordefaulttitledescriptionr   Live preview image IDz&id of last received last preview imageid_live_previewTzInclude live previewzAboolean flag indicating whether to include the live preview imagelive_preview)__name__
__module____qualname__r   r   str__annotations__r"   intr#   boolr   r   r   r   r   0   s   
r   c                   @   s   e Zd ZU eddZeed< eddZeed< eddZeed< edd	d
dZ	e
ed< edddZe
ed< eddddZeed< eddddZeed< eddddZeed< dS )ProgressResponsez-Whether the task is being worked on right now)r   activezWhether the task is in queuequeuedz%Whether the task has already finished	completedNProgressz#The progress with a range of 0 to 1r   progresszETA in secs)r   r   etazLive preview imagez!Current live preview; a data: urir#   r!   zDSend this together with next request to prevent receiving same imager"   z	Info textzInfo text used by WebUI.textinfo)r$   r%   r&   r   r,   r*   r(   r-   r.   r0   floatr1   r#   r'   r"   r)   r2   r   r   r   r   r+   6   s   
r+   c                 C   s   | j dtdgtdS )Nz/internal/progressPOST)methodsresponse_model)add_api_routeprogressapir+   )appr   r   r   setup_progress_apiA   s    r:   )reqc              
   C   s  | j tk}| j tv }| j tv }|spd}|r^tt dd d}|| j }d|d t|}t	|||d|dS d	}t
jjt
jj }}	t
jjt
jj }
}|d	kr||	| 7 }|
d	kr|d	kr|d| | |
 7 }t|d}t t
jj }|d	kr|| nd }|d ur|| nd }d }| j}tjr| jrt
j  t
jj| jkrt
jj}|d urt }tjd
krt|j dkrddi}n
ddd}ni }|j|fdtji| t |! "d}dtj d| }t
jj}t	|||||||t
jj#dS )Nz
Waiting...c                 S   s   t |  S r   )r   )xr   r   r   <lambda>M       zprogressapi.<locals>.<lambda>)keyzIn queue: {}/{}   r    )r,   r-   r.   r"   r2   r   png   optimizeTF)rC   compress_levelformatasciizdata:image/z;base64,)r,   r-   r.   r0   r1   r#   r"   r2   )$r   r   r   r   sortedkeysindexrE   r   r+   sharedstate	job_countjob_nosampling_stepssampling_stepminr   
time_startr"   r   live_previews_enabler#   set_current_imagecurrent_imageioBytesIOlive_previews_image_formatmaxsizesavebase64	b64encodegetvaluedecoder2   )r;   r,   r-   r.   r2   Zsorted_queuedZqueue_indexr0   rL   rM   rN   rO   Zelapsed_since_startZpredicted_durationr1   r#   r"   imagebufferedsave_kwargsZbase64_imager   r   r   r8   E   sN    






r8   c                    sd    t ks tv rtd q tt fddtD d }|d urD|S t t t d  dfS )Ng?c                    s    g | ]} |d  kr|d qS )r   r@   r   ).0r<   r
   r   r   
<listcomp>   r>   z$restore_progress.<locals>.<listcomp>zCouldn't restore progress for z;: results either have been discarded or never were obtained)	r   r   r   sleepnextiterr   grupdater   r   r
   r   restore_progress~   s    ri   )r[   rU   r   gradiorg   pydanticr   r   modules.sharedr   rJ   r   r   r   r   r   r   r   r   r   r   r+   r:   r8   ri   r   r   r   r   <module>   s(   9