sd-model-downloader / scripts /model-downloader.py
FashGate's picture
Upload 2 files
7a6d051
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)