import os
import requests
import argparse
import subprocess
import gradio as gr
from install import checking
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.6 fixed')
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 get_data_from_url(url, downloadpath):
try:
imgurl = get_image_from_url(url)
basename, extension = get_filename_from_url(url)
markdown2 = f'''
Modle File Name : {basename}{extension}
'''
except:
imgurl = no_prev
markdown2 = f'''
Modle File Name : ???
'''
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', visible=True)
info = gr.Markdown.update(markdown2)
return filename, image, download_btn, out_text, info
def start_downloading(download_btn, url, downloadpath, filename, addnet, logging):
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 url.find('https://civitai.com/')!=-1:
target1 = f'{downloadpath}/{filename}'
target2 = f'{addnet_path}/models/lora/{filename}'
else:
target1 = f'{downloadpath}'
target2 = f'{addnet_path}/models/lora'
final_target = None
if addnet:
final_target = target2
else:
final_target = target1
with open('model.txt', 'w') as w:
if not url.find('https://civitai.com/')!=-1:
w.write(f'{url}\n out={filename}{extension}')
else:
imgurl = get_image_from_url(url)
w.write(f'{url}\n out={filename}{extension}\n{imgurl}\n out={imgname}')
command = f'aria2c --console-log-level=error -c -x 16 -s 16 -k 1M --input-file model.txt -d {final_target}'
back(download_btn)
if not os.path.exists(os.path.join(final_target, filename)):
try:
if logging:
command.replace(f' --console-log-level=error', '')
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}')
except Exception:
yield f'{Exception}\n{complete3}'
print(f'{Exception}\n{complete3}')
else:
yield f'{complete2}{final_target}'
print(f'{complete2}{final_target}')
def back(download_btn):
return gr.Button.update(visible=True, variant='secondary')
def on_ui_tabs():
with gr.Blocks() as downloader:
with gr.Row():
content_type = gr.Radio(
label='1. Choose Content type',
choices=[
'Checkpoint',
'Hypernetwork',
'TextualInversion/Embedding',
'VAE',
'LoRA',
'LyCORIS(LoCon/LoHA)',
'ControlNet Model'
]
)
with gr.Row():
with gr.Column():
with gr.Row():
downloadpath = gr.Textbox(visible=False)
addnet = gr.Checkbox(label='save to Additional Networks', value=False, visible=True)
logging = gr.Checkbox(label='turn on log', value=False)
changename = gr.Checkbox(label='Change Filename', value=False)
url = gr.Textbox(
label='2. Put Link Download Below',
max_lines=1, placeholder='Type/Paste URL Here'
)
filename = gr.Textbox(
label='Change Filename',
placeholder='Filename',
visible=False
)
download_btn = gr.Button(
'Start Download',
variant='secondary'
)
out_text = gr.Textbox(
label='Download Result',
placeholder='Result'
)
with gr.Column():
info = gr.Markdown(
'''
Modle File Name :
'''
)
with gr.Row():
image = gr.Image(value=no_prev, show_label=False)
image.style(height=305)
with gr.Row():
github = gr.Markdown(
'''