a
    Ad n                  
   @   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Zd dlZd dl	Z	d dl
Z
d dlZd dlmZmZmZmZmZmZ d dlmZ d dlmZ dg iadZdd	 Zd
d Zdd Zdd Zdd Zd9ddZdd Zdd Z dd Z!d:ddZ"dd Z#dd Z$d d! Z%d"d# Z&d$d%d& fd'd(d& fd'd)d& fd$d*d& fd'd+d& fd$d,d& fd$d-d& fd$d.d& fgZ'e(d/d0d1Z)d;d3d4Z*d5d6 Z+d7d8 Z,dS )<    N)datetimetimezone)
extensionssharedpathsconfig_stateserrorsrestart)config_states_dir)wrap_gradio_gpu_callr   z" style="color: var(--primary-400)"c                   C   s   t jjrJ dd S )Nz7extension access disabled because of command line flags)r   cmd_optsdisable_extension_access r   r   =/var/www/html/stable-diffusion-webui/modules/ui_extensions.pycheck_access   s    r   c              	   C   s   t   t| }t|tks*J d|  t|}t|tksNJ d| |rZtd t|}tjD ]F}|j|vrxqhz|	  W qh t
y   tjd|j dd Y qh0 qh|tj_|tj_tjtj t rt  nt  d S )N/wrong disable_list data for apply_and_restart: z.wrong update_list data for apply_and_restart: zBackup (pre-update)zError getting updates for Texc_info)r   jsonloadstypelistsave_config_statesetr   namefetch_and_reset_hard	Exceptionr   reportr   optsdisabled_extensionsdisable_all_extensionssaveconfig_filenamer	   is_restartableZrestart_programZstop_program)disable_listZupdate_listZdisable_alldisabledupdateextr   r   r   apply_and_restart   s*    




r(   c                 C   s   t  }| sd} | |d< t d}tjt| d|  d}t	d| d t
|dd	d
 }tj||dd W d    n1 s0    Y  t   ttt j d}dgtt j  }tjj||dd| dfS )NConfigr   z%Y_%m_%d-%H_%M_%S_z.jsonz*Saving backup of webui/extension state to .wzutf-8)encoding   )indentCurrent)valuechoicesz.<span>Saved current webui/extension state to "z"</span>)r   
get_configr   nowstrftimeospathjoinr
   printopenr   dumplist_config_statesnextiterall_config_stateskeysr   grDropdownr&   )r   Zcurrent_config_state	timestampfilenamef	new_valueZnew_choicesr   r   r   r   ;   s    .r   c                 C   s   |dkrdS | sdS t   tj| }td| d |dksD|dkr^|d tj_tjtj |d	ksn|dkrxt	| tj
  d
S )Nr0   z-<span>Select a config to restore from.</span>z<span>Cancelled.</span>z'*** Restoring webui state from backup: z ***r   bothfilepathwebui )r   r   r?   r9   r   r   restore_config_state_filer!   r"   Zrestore_webui_configstaterequest_restart)Z	confirmedZconfig_state_nameZrestore_typeconfig_stater   r   r   restore_config_stateK   s    


rO   c                    s   t   t| t tks*J d|  fddtjD }t|tj_	|D ]~}|j
tj_z|  W nX ty } zdt|vr W Y d }~n0d }~0  ty   tjd|j
 dd Y n0 tj  qNt dfS )	Nr   c                    s$   g | ]}|j d ur|j vr|qS N)remoter   .0r'   r%   r   r   
<listcomp>i       z!check_updates.<locals>.<listcomp>
FETCH_HEADzError checking updates for Tr   rJ   )r   r   r   r   r   r   lenr   rL   	job_countr   textinfocheck_updatesFileNotFoundErrorstrr   r   r   nextjobextension_table)id_taskr$   extsr'   er   rT   r   r[   c   s     

r[   c                 C   sZ   |d u r| d d }| drR|dr4|d d }|d |  }d| d| dS |S d S )	N   zhttps://github.com/.gitz/commit/	<a href="" target="_blank"></a>)
startswithendswith)commit_hashrQ   texthrefr   r   r   make_commit_link|   s    

rn   c                  C   s  dt    dtdd tjD r$dnd d} tjD ]\}|  dt|jpPd d	t|jrdd
n|jpld d}|jrdt|j	 dt|j
 d}n|j
}d}tjjr|jrtjjdkr|jrtjjstjjdkrt}|j}|jr
|jr
t|j|j|j}| d| dt|j	 d|jr.dnd dt|j	 d| d|j d| d|jrjt|jnd d|jd urdnd d| d7 } q4| d7 } | S )N<!-- z -->
    <table id="extensions">
        <thead>
            <tr>
                <th>
                    <input class="gr-check-radio gr-checkbox all_extensions_toggle" type="checkbox" c                 s   s   | ]}|j V  qd S rP   )enabledrR   r   r   r   	<genexpr>   rV   z"extension_table.<locals>.<genexpr>checked="checked"rJ   a   onchange="toggle_all_extensions(event)" />
                    <abbr title="Use checkbox to enable the extension; it will be enabled or disabled when you click apply button">Extension</abbr>
                </th>
                <th>URL</th>
                <th>Branch</th>
                <th>Version</th>
                <th>Date</th>
                <th><abbr title="Use checkbox to mark the extension for update; it will be updated when you click apply button">Update</abbr></th>
            </tr>
        </thead>
        <tbody>
    rf   rg   zbuilt-inrh   z><label><input class="gr-check-radio gr-checkbox" name="update_z$" checked="checked" type="checkbox">z</label>extraallz,
            <tr>
                <td><labelzI><input class="gr-check-radio gr-checkbox extension_toggle" name="enable_z" type="checkbox" z& onchange="toggle_extension(event)" />z"</label></td>
                <td></td>
                <td>z</td>
                <tdz class="extension_status">z</td>
            </tr>
    #
        </tbody>
    </table>
    )timert   r   read_info_from_repohtmlescaperQ   
is_builtin
can_updater   statusr   r   disable_extra_extensionsr   r    STYLE_PRIMARYversionrk   rn   rp   branchcommit_dater   fromtimestamp)coder'   rQ   Z
ext_statusstyleZversion_linkr   r   r   r_      sL    4$4

r_   c                 C   s\  | dkrt  }n
t j|  }|dd}tt|d }|dd}z|d d pZd	}|d d
 }|d d pvd}|d d }|rtt|}nd}dt| dt|pd	 d}	t	||}
t	|||}t 
 }d	}d	}d	}|d |krt}|d
 |krt}|d |krt}dt  d| d| d| d| d|	 d| d| d| d|
 d| d| d}dd tjD }|d  D ]`\}}|d pd	}|d
 pd}|d }|d pd}|d }|rtt|}nd}dt| dt|pd	 d}	t	||}
t	|||}d	}d	}d	}d	}||v r|| }|  |j|kr`t}|j|krpt}|j|krt}|j|krt}|d| d|rdnd	 dt| d| d|	 d| d| d| d|
 d| d| d 7 }q|d!7 }W n\ tyV } zBtd"| d#|  dt  d| d| d| d$	}W Y d }~n
d }~0 0 |S )%Nr0   r   r)   
created_atrH   z	<unknown>rI   rQ   rJ   r   rk   r   rf   rg   rh   ro   z -->
<h2>Config Backup: z</h2>
<div><b>Filepath:</b> z</div>
<div><b>Created at:</b> a  </div>
<h2>WebUI State</h2>
<table id="config_state_webui">
    <thead>
        <tr>
            <th>URL</th>
            <th>Branch</th>
            <th>Commit</th>
            <th>Date</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>
                <labelrv   zB</label>
            </td>
            <td>
                <labelaG  </label>
            </td>
        </tr>
    </tbody>
</table>
<h2>Extension State</h2>
<table id="config_state_extensions">
    <thead>
        <tr>
            <th>Extension</th>
            <th>URL</th>
            <th>Branch</th>
            <th>Commit</th>
            <th>Date</th>
        </tr>
    </thead>
    <tbody>
c                 S   s   i | ]}|j |qS r   )r   rR   r   r   r   
<dictcomp>  rV   z.update_config_states_table.<locals>.<dictcomp>r   rp   z#        <tr>
            <td><labelzK><input class="gr-check-radio gr-checkbox" type="checkbox" disabled="true" rr   z$</label></td>
            <td><labelz</label></td>
        </tr>
z    </tbody>
</table>z[ERROR]: Config states , z&</div>
<h2>This file is corrupted</h2>)r   r3   r?   getrx   asctimegmtimerz   r{   rn   Zget_webui_configr   r   itemsry   rp   rQ   r   rk   r   r9   )
state_namerN   config_nameZcreated_daterH   Zwebui_remoteZwebui_branchZwebui_commit_hashZwebui_commit_daterQ   Zcommit_linkZ	date_linkZcurrent_webuiZstyle_remoteZstyle_branchZstyle_commitr   Zext_mapZext_nameZext_confZ
ext_remoteZ
ext_branchZext_enabledZext_commit_hashZext_commit_dateZstyle_enabledZcurrent_extrb   r   r   r   update_config_states_table   s    

"
-$

	r   c                 C   s   | d u rdS |  dd} | S )NrJ   rd   )replace)urlr   r   r   normalize_git_urlJ  s    r   c              
      s@  t   t| tr|  } t|tr*| }|s6J d| d u sF| dkrb|d^ }}t|}|} tjt	j
| }tj|rJ d| t| t fddt	j	D rtd| tjtjd| }z^t|d	 |s<tjj||d
gd2}|   |jD ]}|  q
W d    n1 s00    Y  nZtjj||d
g|d2}|   |jD ]}|  qfW d    n1 s0    Y  zt|| W nF ty }	 z,|	jtjkrt|| n|	W Y d }	~	n
d }	~	0 0 dd l}
|
| t	   t! t"#d| dgW t|d	 S t|d	 0 d S )NzNo URL specifiedrJ   /z$Extension directory already exists: c                 3   s    | ]}t |j kr|V  qd S rP   )r   rQ   rS   xZnormalized_urlr   r   rq   f  rV   z-install_extension_from_url.<locals>.<genexpr>z.Extension with this URL is already installed: tmpTz	blob:none)filter)r   r   r   zInstalled into z. Use Installed tab to restart.)$r   
isinstancer]   stripsplitr   r6   r7   r8   r   extensions_direxistsanyr   r   	data_pathshutilrmtreegitRepo
clone_fromrQ   fetch
submodulesr&   renameOSErrorerrnoZEXDEVmovelaunchrun_extension_installerlist_extensionsr_   rz   r{   )dirnamer   branch_namepartsZ	last_part
target_dirtmpdirrepo	submoduleerrr   r   r   r   install_extension_from_urlR  sP    


.
,
r   c                 C   s*   t d | \}}t|||\}}|||dfS NrJ   )r   &refresh_available_extensions_from_data)r   	hide_tagssort_columnfilter_textZ	ext_tablemessager   r*   r   r   r   install_extension_from_index  s    r   c                 C   sl   dd l }|j| }| }W d    n1 s20    Y  t|at||\}}| |tj	j
|dddfS )Nr   )r2   rJ   )urllib.requestrequesturlopenreadr   r   available_extensionsr   rA   CheckboxGroupr&   )r   r   r   urllibresponserl   r   tagsr   r   r   refresh_available_extensions  s    &
r   c                 C   s   t | ||\}}|dfS r   r   )r   r   r   r   r*   r   r   r   %refresh_available_extensions_for_tags  s    r   c                 C   s   t ||| \}}|dfS r   r   )r   r   r   r   r*   r   r   r   search_extensions  s    r   Tc                 C   s   |  ddS Naddedzr   r   r   r   r   <lambda>  rV   r   Fc                 C   s   |  ddS r   r   r   r   r   r   r     rV   c                 C   s   |  ddS Nr   r   r   r   r   r   r   r     rV   c                 C   s   |  ddS r   r   r   r   r   r   r     rV   c                 C   s   dS )Nr   r   r   r   r   r   r     rV   c                 C   s   |  ddS )Ncommit_timerJ   r   r   r   r   r   r     rV   c                 C   s   |  ddS )Nr   rJ   r   r   r   r   r   r     rV   c                 C   s   |  ddS )Nstarsr   r   r   r   r   r   r     rV   )infoc              	   C   sF   z(t | |djtjd dW S  tt	fy@   Y dS 0 d S )Nz%Y-%m-%dT%H:%M:%SZ)tzinfoz%Y-%m-%drJ   )
r   strptimer   r   r   utc
astimezoner5   
ValueError	TypeError)r   keyr   r   r   get_date  s    (r   rJ   c                    sz  t d }dd tjD }t di  t| d}dt  d}td|  krZttk rbn n|nd \}}t|||dD ]}	|	d	d
}
t|	dd}|	dd}t	|	d}t	|	d}|	dd }|	dd}|	dg }|d u rqz|t
|d }|r
|dg n|}tfdd|D r0|d7 }qz|rz| rz| t|
 vrz| t| vrz|d7 }qzdt| d|rdnd d|sdnd d}d fdd |D }|d!t| d"t|
 d#| d$t| d%t| d&t| d't| d(| d)| d*7 } fd+d |D D ]}| |< q:qz|d,7 }|dkrn|d-| d.7 }|t fS )/Nr   c                 S   s   i | ]}t |j|jqS r   )r   rQ   r   )rS   	extensionr   r   r   r     rV   z:refresh_available_extensions_from_data.<locals>.<dictcomp>r   r   ro   z -->
    <table id="available_extensions">
        <thead>
            <tr>
                <th>Extension</th>
                <th>Description</th>
                <th>Action</th>
            </tr>
        </thead>
        <tbody>
    )r   reverser   Znonamer   r   unknownr   r   r   descriptionrJ   	installedc                 3   s   | ]}| v r|V  qd S rP   r   r   )tags_to_hider   r   rq     rV   z9refresh_available_extensions_from_data.<locals>.<genexpr>   z5<button onclick="install_extension_from_index(this, 'z')" zdisabled=disabledz2 class="lg secondary gradio-button custom-button">Install	Installedz	</button>r   c                    s&   g | ]}d   |d d| dqS )z#<span class='extension-tag' title='rJ   z'></span>r   r   r   r   r   rU     rV   z:refresh_available_extensions_from_data.<locals>.<listcomp>z/
            <tr>
                <td><a href="rg   z
</a><br />ru   zB<p class="info">
                <span class="date_added">Update: z	  Added: z  Created: z*</span><span class="star_count">stars: <b>z&</b></a></p></td>
                <td>z!</td>
            </tr>

        c                    s   g | ]}| vr|qS r   r   r   r   r   r   rU     rV   rw   z<p>Extension hidden: z</p>)r   r   r   r   rx   sort_orderingrX   sortedintr   r   r   r   lowerrz   r{   r8   r   )r   r   r   extlistZinstalled_extension_urlshiddenr   Zsort_reversesort_functionr'   r   r   r   Zupdate_timecreate_timer   r   Zextension_tagsexistingZinstall_codeZ	tags_texttagr   )r   r   r   r     sl    ,

02


r   c                  C   s   t j D ]} |   qd S rP   )r   ry   )r   r   r   r   preload_extensions_git_metadata  s    
r   c            "      C   s  dd l } t  tjtd  tjdd}tj	ddb tj
ddd	 tjd
dt t rldnd}tj|dd}tjdd}tjdg dtjjdd}tjdddd}tjdddd}W d    n1 s0    Y  d}tjjstjjstjjdkrFtjjrd}	n"tjjdkr,d}	ntjjr:d}	d|	 d}t  t|}
W d    n1 sp0    Y  tjdd  tjd!d"d}W d    n1 s0    Y  |jtg |gd# |jtd$|||gg d% |jttt gd&d'|
|g||
gd% W d    n1 s0    Y  tj
d(d)d	  t X tjd*dd}tj d+d,}tj|d-dd.}tjd/dd0}tjd1dd0}W d    n1 s0    Y  t > tj!g d2d3g d4d5}tjd6d7g d8d9d:}W d    n1 s0    Y  t  tjd;dd<}W d    n1 s20    Y  t }t }|j| j"j#t$t t t t gd&|||g|||||gd# |j| j"j#t%t t gd&||||g|||gd# |j&| j"j#t't gd&|||g||gd# |j&| j"j#t(t gd&|||g||gd# |j&| j"j#t(t gd&|||g||gd# W d    n1 s`0    Y  tj
d=d>d	 tjd?d@}tjdAdBdC}tjdDdEdC}tjdFdd}tjdGd}|j| j"j#dHdI t t gd&|||g|||gd# W d    n1 s
0    Y  t
dJ` tjdKdp tj)dLdMdNdNgt*tj+,  dO}| j"-|tjdPdI dQ tjdRg dSdTdUd}tjdVddWdX}W d    n1 s0    Y  tjdYd, tj.ddZdd[}tjd\d}W d    n1 s0    Y  td}td!} |jt/|g| gd# |jt0|g||gd# tj1dd]}!|jt2d^|!||g|gd% |j&t/|g| gd# W d    n1 s0    Y  W d    n1 s0    Y  W d    n1 s0    Y  |S )_Nr   )targetF)analytics_enabledZtabs_extensions)elem_idr   r   )idZextensions_installed_topzApply and restart UIzApply and quitprimary)r1   variantzCheck for updates)r1   zDisable all extensions)noners   rt   extensions_disable_all)labelr2   r1   r   extensions_disabled_list)r   visible	containerextensions_update_listrJ   r   zK"--disable-all-extensions" was used, remove it to load all extensions againzR"Disable all extensions" was set, change it to "none" to load all extensions againzM"--disable-extra-extensions" was used, remove it to load all extensions againz)<span style="color: var(--primary-400);">r   zprogress-container)elem_classesz
Loading...Zextensions_installed_html)fninputsoutputsZextensions_apply)r  _jsr  r  )extra_outputsZextensions_checkZ	Available	availablez
Load from:ZWEBUI_EXTENSIONS_INDEXzchttps://raw.githubusercontent.com/AUTOMATIC1111/stable-diffusion-webui-extensions/master/index.jsonzExtension index URL)r1   r   r   extension_to_install)r   r   install_extension_button)adslocalizationr   zHide extensions with tags)scriptr
  r  r   )r1   r   r2   newest firstOrder)r  zoldest firstza-zzz-azinternal orderzupdate timezcreate timer   index)r1   r   r2   r   ZSearch)r   r   zInstall from URLZinstall_from_urlz"URL for extension's git repository)r   zSpecific branch namez#Leave empty for default main branch)r   placeholderzLocal directory namezLeave empty for autor   Zextension_install_resultc                  W   s   t  gt|  S rP   )rA   r&   r   )argsr   r   r   r   ~  rV   zcreate_ui.<locals>.<lambda>zBackup/RestoreZextensions_backup_top_rowzSaved ConfigsZextension_backup_saved_configsr0   )r   r   r1   r2   c                   S   s   ddgt tj  iS )Nr2   r0   )r   r   r?   r@   r   r   r   r   r     rV   Zrefresh_config_stateszState to restore)r   rI   rG   r   Zextension_backup_restore_typezRestore Selected ConfigZextension_backup_restore)r1   r   r   Zextensions_backup_top_row2zConfig Name)r  
show_labelzSave Current Config)r   Zconfig_state_confirm_restore)3
modules.uir   r<   	threadingThreadr   startrA   BlocksTabsTabItemRowr	   r#   ButtonRadior   r   r    Textr   r   HTMLloadr_   clickr(   r   r[   r&   r6   environr   r   uiwrap_gradio_callr   r   changer   r   rB   r   r?   r@   create_refresh_buttonTextboxr   r   LabelrO   )"modulesr"  Zapply_labelapplycheckr   r   r   rz   msgr   Zextensions_tableZ#refresh_available_extensions_buttonZextensions_index_urlZavailable_extensions_indexr  r	  r   r   Zsearch_extensions_textZinstall_resultZavailable_extensions_tableZinstall_urlZinstall_branchZinstall_dirnameZinstall_buttonZconfig_states_listZconfig_restore_typeZconfig_restore_buttonZconfig_save_nameZconfig_save_buttonZconfig_states_infoZconfig_states_tabledummy_componentr   r   r   	create_ui  s    ."


*.&
.
6
.&
&&"0,

fr-  )N)N)rJ   )-r   r6   r  rx   r   r   r   gradiorA   rz   r   r   r(  r   r   r   r   r   r	   modules.paths_internalr
   modules.call_queuer   r   r   r   r(   r   rO   r[   rn   r_   r   r   r   r   r   r   r   r   dictr   r   r   r-  r   r   r   r   <module>   sT    !
9 

:








K