|
import os |
|
import requests |
|
import argparse |
|
import subprocess |
|
import gradio as gr |
|
from urllib.parse import urlparse |
|
from modules import scripts, script_callbacks |
|
try: |
|
from modules.paths_internal import data_path, models_path, extensions_dir |
|
except ImportError: |
|
from modules.paths import data_path, models_path |
|
extensions_dir = os.path.join(data_path, 'extensions') |
|
|
|
sd_path = os.getcwd() |
|
ext = '/extensions' |
|
no_prev = None |
|
addnet_path = None |
|
md_path = scripts.basedir() |
|
|
|
parser = argparse.ArgumentParser() |
|
parser.add_argument('--ckpt-dir', type=str, default=os.path.join(models_path, 'Stable-diffusion')) |
|
parser.add_argument('--vae-dir', type=str, default=os.path.join(models_path, 'VAE')) |
|
parser.add_argument('--embeddings-dir', type=str, default=os.path.join(data_path, 'embeddings')) |
|
parser.add_argument('--hypernetwork-dir', type=str, default=os.path.join(models_path, 'hypernetworks')) |
|
parser.add_argument('--lora-dir', type=str, default=os.path.join(models_path, 'Lora')) |
|
parser.add_argument('--lyco-dir', type=str, default=os.path.join(models_path, 'LyCORIS')) |
|
args, _ = parser.parse_known_args() |
|
|
|
if not os.path.exists(os.path.join(sd_path, 'html', 'card-no-preview.png')): |
|
try: |
|
no_prev = os.path.join(md_path, 'images', 'card-no-prev.png') |
|
except: |
|
pass |
|
else: |
|
no_prev = os.path.join(sd_path, 'html', 'card-no-preview.png') |
|
if not os.path.exists(os.path.join(sd_path, ext, 'sd-webui-additional-networks')): |
|
addnet_path = os.path.join(extensions_dir, 'sd-webui-additional-networks') |
|
else: |
|
addnet_path = os.path.join(sd_path, ext, 'sd-webui-additional-networks') |
|
|
|
checkpoint_path = args.ckpt_dir |
|
vae_path = args.vae_dir |
|
embedding_path = args.embeddings_dir |
|
hypernetwork_path = args.hypernetwork_dir |
|
lora_path = args.lora_dir |
|
lycoris_path = args.lyco_dir |
|
controlnet_path = os.path.join(extensions_dir, 'sd-webui-controlnet') |
|
controlnet_model_path = os.path.join(controlnet_path, 'models') |
|
|
|
print(f'Model Downloader v1.0.8 Pre') |
|
print('Checking Directories...') |
|
if not os.path.exists(checkpoint_path): |
|
os.makedirs(checkpoint_path) |
|
print ('Creating Checkpoint Folder') |
|
if not os.path.exists(hypernetwork_path): |
|
os.makedirs(hypernetwork_path) |
|
print ('Creating Hypernetwork Folder') |
|
if not os.path.exists(embedding_path): |
|
os.makedirs(embedding_path) |
|
print ('Creating TextualInversion/Embeddings Folder') |
|
if not os.path.exists(vae_path): |
|
os.makedirs(vae_path) |
|
print ('Creating VAE Folder') |
|
if not os.path.exists(lora_path): |
|
os.makedirs(lora_path) |
|
print ('Creating LoRA Folder') |
|
if not os.path.exists(lycoris_path): |
|
os.makedirs(lycoris_path) |
|
print ('Creating LyCORIS Folder') |
|
else: |
|
pass |
|
print('all Directories already Created.') |
|
|
|
def folder(content_type): |
|
if content_type == 'Checkpoint': |
|
downloadpath = checkpoint_path |
|
elif content_type == 'Hypernetwork': |
|
downloadpath = hypernetwork_path |
|
elif content_type == 'TextualInversion/Embedding': |
|
downloadpath = embedding_path |
|
elif content_type == 'VAE': |
|
downloadpath = vae_path |
|
elif content_type == 'LoRA': |
|
downloadpath = lora_path |
|
elif content_type == 'LyCORIS(LoCon/LoHA)': |
|
downloadpath = lycoris_path |
|
elif content_type == 'ControlNet Model': |
|
downloadpath = controlnet_model_path |
|
else: |
|
downloadpath = 'Unset, Please Choose your Content Type' |
|
return downloadpath |
|
|
|
def get_filename_from_url(url): |
|
if url.find('https://civitai.com/')!=-1: |
|
convert = '' + url.replace('download/models', 'v1/model-versions') |
|
req = requests.get(convert, stream=True) |
|
basename, extension = os.path.splitext(req.json()['files'][0]['name'].replace(' ', '_')) |
|
else: |
|
parse = urlparse(url).path |
|
req = parse[parse.rfind('/') + 1:].replace(' ', '_') |
|
basename, extension = os.path.splitext(req) |
|
return basename, extension |
|
|
|
def get_image_from_url(url): |
|
if url.find('https://civitai.com/')!=-1: |
|
convert = '' + url.replace('download/models', 'v1/model-versions') |
|
req = requests.get(convert, stream=True) |
|
imgurl = req.json()['images'][0]['url'] |
|
else: |
|
imgurl = no_prev |
|
return imgurl |
|
|
|
def change_name(changename): |
|
if changename: |
|
filename = gr.Textbox.update(visible=True) |
|
else: |
|
filename = gr.Textbox.update(visible=False) |
|
return filename |
|
|
|
def custom_download_path(custompath): |
|
if custompath: |
|
downloadpath = gr.Textbox.update(visible=True) |
|
else: |
|
downloadpath = gr.Textbox.update(visible=False) |
|
return downloadpath |
|
|
|
def get_data_from_url(url, downloadpath): |
|
try: |
|
imgurl = get_image_from_url(url) |
|
basename, extension = get_filename_from_url(url) |
|
markdown2 = f''' |
|
<font size=2> |
|
<b>模型链接:</b> {url}<br> |
|
<b>模型路径:</b> {downloadpath}<br> |
|
<b>模型名称:</b> {basename}{extension}<br> |
|
''' |
|
except: |
|
imgurl = no_prev |
|
markdown2 = f''' |
|
<font size=2> |
|
<b>模型链接:</b> {url}<br> |
|
<b>模型路径:</b> {downloadpath}<br> |
|
<b>模型名称:</b> ??? |
|
''' |
|
filename = gr.Textbox.update(basename) |
|
image = gr.Image.update(imgurl) |
|
download_btn = gr.Button.update(visible=True, variant='primary') |
|
out_text = gr.Textbox.update('Ready\nClick to start downloading', visible=True) |
|
info = gr.Markdown.update(markdown2) |
|
return filename, image, download_btn, out_text, info |
|
|
|
def start_downloading(downloader_type, download_btn, url, downloadpath, filename, addnet, logging, new_folder, preview): |
|
complete1 = f'SUCCESS: Download Completed, Saved to\n' |
|
complete2 = f'ERROR: File Already Exist in\n' |
|
complete3 = 'ERROR: Something went wrong, please try again later' |
|
path, extension = get_filename_from_url(url) |
|
imgname = f'{filename}.preview.png' |
|
if new_folder: |
|
target1 = os.path.join(downloadpath, filename) |
|
target2 = os.path.join(addnet_path, 'models', 'lora', filename) |
|
else: |
|
target1 = os.path.join(downloadpath) |
|
target2 = os.path.join(addnet_path, 'models', 'lora') |
|
final_target = None |
|
if addnet: |
|
final_target = target2 |
|
else: |
|
final_target = target1 |
|
back(download_btn) |
|
if not os.path.exists(os.path.join(final_target, f'{filename}{extension}')): |
|
try: |
|
if downloader_type == 'aria2': |
|
command = f'aria2c -c -x 16 -s 16 -k 1M --input-file model.txt -d {final_target}' |
|
with open('model.txt', 'w') as w: |
|
if not url.find('https://civitai.com/')!=-1: |
|
w.write(f'{url}\n out={filename}{extension}') |
|
else: |
|
if preview: |
|
imgurl = get_image_from_url(url) |
|
w.write(f'{url}\n out={filename}{extension}\n{imgurl}\n out={imgname}') |
|
else: |
|
w.write(f'{url}\n out={filename}{extension}') |
|
if logging: |
|
line = subprocess.getoutput(command) |
|
yield line |
|
print(line) |
|
else: |
|
line = os.popen(command) |
|
for l in line: |
|
l = l.rstrip() |
|
yield f'{complete1}{final_target}' |
|
print(f'{complete1}{final_target}') |
|
elif downloader_type == 'requests': |
|
if new_folder: |
|
os.makedirs(final_target, exist_ok=True) |
|
else: |
|
pass |
|
download = requests.get(url, allow_redirects=True) |
|
if not url.find('https://civitai.com/')!=-1: |
|
with open(os.path.join(final_target, f'{filename}{extension}'), 'wb') as f: |
|
f.write(download.content) |
|
else: |
|
if preview: |
|
imgurl = get_image_from_url(url) |
|
img_download = requests.get(str(imgurl), allow_redirects=True) |
|
with open(os.path.join(final_target, f'{filename}{extension}'), 'wb') as f: |
|
f.write(download.content) |
|
with open(os.path.join(final_target, imgname), 'wb') as img: |
|
img.write(img_download.content) |
|
else: |
|
with open(os.path.join(final_target, f'{filename}{extension}'), 'wb') as f: |
|
f.write(download.content) |
|
yield f'{complete1}{final_target}' |
|
print(f'{complete1}{final_target}') |
|
except Exception as e: |
|
yield f'{e}\n{complete3}' |
|
print(f'{e}\n{complete3}') |
|
else: |
|
yield f'{complete2}{final_target}' |
|
print(f'{complete2}{final_target}') |
|
|
|
def back(download_btn): |
|
return gr.Button.update(visible=True, variant='primary') |
|
|
|
def on_ui_tabs(): |
|
with gr.Blocks() as downloader: |
|
with gr.Row(): |
|
with gr.Column(scale=8): |
|
content_type = gr.Radio( |
|
label='选择模型类型', |
|
choices=[ |
|
'Checkpoint', |
|
'Hypernetwork ', |
|
'TextualInversion/Embedding', |
|
'VAE', |
|
'LoRA', |
|
'LyCORIS(LoCon/LoHA)', |
|
'ControlNet Model' |
|
] |
|
) |
|
with gr.Column(scale=1): |
|
downloader_type = gr.Radio( |
|
label='选择下载器类型', |
|
choices=[ |
|
'aria2', |
|
'requests' |
|
], |
|
value='aria2', |
|
type='value' |
|
) |
|
with gr.Row(): |
|
with gr.Column(): |
|
with gr.Row(): |
|
addnet = gr.Checkbox(label='save to Additional Networks', value=True) |
|
new_folder = gr.Checkbox(label='Create New Folder', value=True, visible=False) |
|
custompath = gr.Checkbox(label='Custom Download Path', value=False, visible=False) |
|
preview = gr.Checkbox(label='Download Preview', value=True, visible=False) |
|
logging = gr.Checkbox(label='turn on log', value=False) |
|
changename = gr.Checkbox(label='Change Filename', value=False) |
|
with gr.Row(): |
|
with gr.Column(): |
|
url = gr.Textbox( |
|
label='输入模型下载链接', |
|
max_lines=1, placeholder='Type/Paste URL Here' |
|
) |
|
info = gr.Markdown( |
|
''' |
|
<font size=2> |
|
<b>模型链接: Please enter the model link</b><br> |
|
<b>模型路径: Please enter the model link</b><br> |
|
<b>模型名称: Please enter the model link</b> |
|
''' |
|
) |
|
downloadpath = gr.Textbox( |
|
value='Unset, Please Choose your Content Type', |
|
label='Custom Download Path', |
|
placeholder='Paste Folder Path Here', |
|
visible=False |
|
) |
|
filename = gr.Textbox( |
|
label='Change Filename', |
|
placeholder='Filename', |
|
visible=False |
|
) |
|
with gr.Row(): |
|
with gr.Column(): |
|
download_btn = gr.Button( |
|
'Start Download', |
|
visible=True, |
|
variant='secondary' |
|
) |
|
out_text = gr.Textbox( |
|
label='Download Result', |
|
placeholder='Result\n ', |
|
visible=True, |
|
interactive=False, |
|
) |
|
with gr.Column(): |
|
prev_markdown = gr.Markdown('''<font size=2><b>Preview Model :</b>''', visible=False) |
|
with gr.Row(): |
|
image = gr.Image(value=no_prev, show_label=False) |
|
image.style(height=332) |
|
with gr.Row(): |
|
github = gr.Markdown( |
|
''' |
|
<center><font size=2>Having Issue? | |
|
<a href=https://github.com/Iyashinouta/sd-model-downloader/issues> |
|
Report Here</a><br> |
|
<center><font size=1>Model Downloader v1.0.8 Pre |
|
''' |
|
) |
|
content_type.change(folder, content_type, downloadpath) |
|
changename.change(change_name, changename, filename) |
|
custompath.change(custom_download_path, custompath, downloadpath) |
|
url.change( |
|
get_data_from_url, |
|
[url,downloadpath], |
|
[filename,image,download_btn,out_text,info] |
|
) |
|
download_btn.click( |
|
start_downloading, |
|
[downloader_type,download_btn,url,downloadpath,filename,addnet,logging,new_folder,preview], |
|
out_text |
|
) |
|
url.submit( |
|
start_downloading, |
|
[downloader_type,download_btn,url,downloadpath,filename,addnet,logging,new_folder,preview], |
|
out_text |
|
) |
|
download_btn.click(back, download_btn, download_btn) |
|
url.submit(back, url, download_btn) |
|
return (downloader, 'Model Downloader', 'downloader'), |
|
|
|
script_callbacks.on_ui_tabs(on_ui_tabs) |
|
|