a
    AþdÇ  ã                   @  sÎ   d dl m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mZ d dlmZmZ dddœd	d	d
dd	dœdd„Zdd	d	d	ddœdd„Zd	dœdd„Zdd„ Zdd	d	d	dœdd„Zdd„ ZdS )é    )ÚannotationsN)Úurlparse)Úshared)ÚUpscalerÚUpscalerLanczosÚUpscalerNearestÚUpscalerNone)Úscript_pathÚmodels_pathT)ÚprogressÚ	file_nameÚstrÚboolz
str | None)ÚurlÚ	model_dirr   r   Úreturnc                C  s~   t j|dd |s(t| ƒ}t j |j¡}t j t j ||¡¡}t j |¡sztd| › d|› dƒ ddl	m
} || ||d |S )	zƒDownload a file from `url` into `model_dir`, using the file present if possible.

    Returns the path to the downloaded file.
    T©Úexist_okzDownloading: "z" to Ú
r   )Údownload_url_to_file)r   )ÚosÚmakedirsr   ÚpathÚbasenameÚabspathÚjoinÚexistsÚprintÚ	torch.hubr   )r   r   r   r   ÚpartsÚcached_filer   © r!   ú;/var/www/html/stable-diffusion-webui/modules/modelloader.pyÚload_file_from_url   s    r#   Úlist)Ú
model_pathÚ	model_urlÚcommand_pathr   c           
        sJ  g }z*g }|durf|| krft j |d¡}t j |¡rPtd|› ƒ | |¡ nt j |¡rf| |¡ | | ¡ |D ]r}	tj|	|dD ]^‰ t j ˆ ¡r²t j ˆ ¡s²tdˆ › ƒ q†|durÒt	‡ fdd„|D ƒƒrÒq†ˆ |vr†| ˆ ¡ q†qt|dur.t
|ƒdkr.|dur$| t||d |d	¡ n
| |¡ W n tyD   Y n0 |S )
a  
    A one-and done loader to try finding the desired models in specified directories.

    @param download_name: Specify to download from model_url immediately.
    @param model_url: If no other models are found, this will be downloaded on upscale.
    @param model_path: The location to store/find models in.
    @param command_path: A command-line argument to search for models in first.
    @param ext_filter: An optional list of filename extensions to filter by
    @return: A list of paths containing the desired model(s)
    Nzexperiments/pretrained_modelszAppending path: )Úallowed_extensionszSkipping broken symlink: c                 3  s   | ]}ˆ   |¡V  qd S )N)Úendswith)Ú.0Úx©Ú	full_pathr!   r"   Ú	<genexpr>C   ó    zload_models.<locals>.<genexpr>r   )r   r   )r   r   r   r   r   Úappendr   Ú
walk_filesÚislinkÚanyÚlenr#   Ú	Exception)
r%   r&   r'   Ú
ext_filterÚdownload_nameZext_blacklistÚoutputÚplacesZpretrained_pathÚplacer!   r,   r"   Úload_models$   s6    


r;   )Úfilec                 C  s4   |   d¡rt| ƒj} tj | ¡} tj | ¡\}}|S )NÚhttp)Ú
startswithr   r   r   r   Úsplitext)r<   Ú
model_nameÚ	extensionr!   r!   r"   Úfriendly_nameT   s
    

rB   c                  C  sò   t } t}tj td¡}t||dƒ t||dƒ tj | d¡}tj td¡}t||ƒ tj td¡}tj td¡}t||dƒ tj | d¡}tj td¡}t||ƒ tj | d	¡}tj td	¡}t||ƒ tj | d
¡}tj td¡}t||ƒ d S )NzStable-diffusionz.ckptz.safetensorsZESRGANZBSRGANz.pthÚgfpganZGFPGANZSwinIRz<repositories/latent-diffusion/experiments/pretrained_models/ZLDSR)r	   r
   r   r   r   Ú
move_files)Ú	root_pathÚsrc_pathÚ	dest_pathr!   r!   r"   Úcleanup_models]   s(    


rH   )rF   rG   r6   c              	   C  sÞ   zÆt j|dd t j | ¡rÄt  | ¡D ]p}t j | |¡}t j |¡r&|d urV||vrVq&td|› d| › d|› dƒ zt 	||¡ W q& t
y”   Y q&0 q&tt  | ¡ƒdkrÄtd| › ƒ t | d¡ W n t
yØ   Y n0 d S )	NTr   zMoving z from z to Ú.r   zRemoving empty folder: )r   r   r   r   Úlistdirr   Úisfiler   ÚshutilÚmover5   r4   Úrmtree)rF   rG   r6   r<   Úfullpathr!   r!   r"   rD   w   s&    rD   c               	   C  s  t j tjd¡} t  | ¡D ]F}d|v r| dd¡}d|› d}zt |¡ W q t	y^   Y q0 qg }t
tjƒ}i }tt ¡ ƒD ]}t|ƒ}||vr€|||< q€t| ¡ ƒD ]P}|j}	|	 ¡  dd¡› d}
| |
d ¡}||ƒ}||_|pì|j|_||j7 }qªt|dd	„ d
t_d S )NÚmodulesz	_model.pyÚ zmodules.Ú_modelÚupscalerZ_models_pathc                 S  s    t | jtttfƒs| j ¡ S dS )NrQ   )Ú
isinstanceÚscalerr   r   r   ÚnameÚlower)r+   r!   r!   r"   Ú<lambda>²   r/   z load_upscalers.<locals>.<lambda>)Úkey)r   r   r   r   r	   rJ   ÚreplaceÚ	importlibÚimport_moduler5   ÚvarsÚcmd_optsÚreversedr   Ú__subclasses__r   ÚvaluesÚ__name__rW   ÚgetZ	user_pathr%   Zmodel_download_pathÚscalersÚsortedÚsd_upscalers)Zmodules_dirr<   r@   Z
full_modelÚdatasZcommandline_optionsZused_classesÚclsÚ	classnamerV   Úcmd_nameZcommandline_model_pathrU   r!   r!   r"   Úload_upscalers   s8    

ýrk   )NNNNN)N)Ú
__future__r   r   rL   r[   Úurllib.parser   rP   r   Zmodules.upscalerr   r   r   r   Zmodules.pathsr	   r
   r#   r;   rB   rH   rD   rk   r!   r!   r!   r"   Ú<module>   s   û0	