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( '''
Having Issue? | Report Here
Model Downloader v1.0.6 fixed ''' ) content_type.change(folder, content_type, downloadpath) changename.change(change_name, changename, filename) url.change(get_data_from_url, [url, downloadpath], [filename, image, download_btn, out_text, info]) download_btn.click(start_downloading, [download_btn, url, downloadpath, filename, addnet, logging], out_text) url.submit(start_downloading, [download_btn, url, downloadpath, filename, addnet, logging], 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)