| | |
| |
|
| | import os |
| | import re |
| | import time |
| | import json |
| | import requests |
| | import subprocess |
| | from datetime import timedelta |
| | from subprocess import getoutput |
| | from urllib.parse import unquote |
| | from IPython.utils import capture |
| | from IPython.display import clear_output |
| |
|
| |
|
| | |
| | def detect_environment(): |
| | free_plan = (os.sysconf('SC_PAGE_SIZE') * os.sysconf('SC_PHYS_PAGES') / (1024. ** 3) <= 20) |
| | environments = { |
| | 'COLAB_GPU': ('Google Colab', "/root" if free_plan else "/content"), |
| | 'KAGGLE_URL_BASE': ('Kaggle', "/kaggle/working/content") |
| | } |
| |
|
| | for env_var, (environment, path) in environments.items(): |
| | if env_var in os.environ: |
| | return environment, path, free_plan |
| |
|
| | env, root_path, free_plan = detect_environment() |
| | webui_path = f"{root_path}/sdw" |
| | |
| |
|
| |
|
| | |
| | flag_file = f"{root_path}/libraries_installed.txt" |
| |
|
| | if not os.path.exists(flag_file): |
| | print("💿 Installing the libraries, it's going to take a while:\n") |
| |
|
| | install_lib = { |
| | "gdown": "pip install -U gdown", |
| | "aria2": "apt-get update && apt -y install aria2", |
| | "localtunnel": "npm install -g localtunnel &> /dev/null", |
| | "insightface": "pip install insightface", |
| | } |
| |
|
| | |
| | additional_libs = { |
| | "Google Colab": { |
| | "xformers": "pip install xformers==0.0.25 --no-deps" |
| | }, |
| | "Kaggle": { |
| | "xformers": "pip install -q xformers==0.0.23.post1 triton==2.1.0", |
| | "torch": "pip install -q torch==2.1.2+cu121 torchvision==0.16.2+cu121 torchaudio==2.1.2 --extra-index-url https://download.pytorch.org/whl/cu121" |
| | } |
| | } |
| |
|
| | |
| | if env in additional_libs: |
| | install_lib.update(additional_libs[env]) |
| |
|
| | |
| | for index, (package, install_cmd) in enumerate(install_lib.items(), start=1): |
| | print(f"\r[{index}/{len(install_lib)}] \033[32m>>\033[0m Installing \033[33m{package}\033[0m..." + " "*35, end='') |
| | subprocess.run(install_cmd, shell=True, capture_output=True) |
| |
|
| | |
| | with capture.capture_output() as cap: |
| | get_ipython().system('curl -s -OL https://github.com/vorstcavry/tunnel/res/new_tunnel --output-dir {root_path}') |
| | get_ipython().system('curl -s -Lo /usr/bin/cl https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 && chmod +x /usr/bin/cl') |
| | get_ipython().system('curl -sLO https://github.com/openziti/zrok/releases/download/v0.4.23/zrok_0.4.23_linux_amd64.tar.gz && tar -xzf zrok_0.4.23_linux_amd64.tar.gz -C /usr/bin && rm -f zrok_0.4.23_linux_amd64.tar.gz') |
| | del cap |
| |
|
| | clear_output() |
| |
|
| | |
| | with open(flag_file, "w") as f: |
| | f.write(">W<'") |
| |
|
| | print("🍪 Libraries are installed!" + " "*35) |
| | time.sleep(2) |
| | clear_output() |
| |
|
| |
|
| | |
| | def load_settings(path): |
| | if os.path.exists(path): |
| | with open(path, 'r') as file: |
| | return json.load(file) |
| | return {} |
| |
|
| | settings = load_settings(f'{root_path}/settings.json') |
| |
|
| | variables = [ |
| | 'Model', 'Model_Num', 'Inpainting_Model', |
| | 'Vae', 'Vae_Num', |
| | 'latest_webui', 'latest_exstensions', 'detailed_download', |
| | 'controlnet', 'controlnet_Num', 'commit_hash', 'optional_huggingface_token', |
| | 'ngrok_token', 'zrok_token', 'commandline_arguments', |
| | 'Model_url', 'Vae_url', 'LoRA_url', 'Embedding_url', 'Extensions_url', 'custom_file_urls' |
| | ] |
| |
|
| | locals().update({key: settings.get(key) for key in variables}) |
| |
|
| |
|
| | |
| | try: |
| | start_colab |
| | except: |
| | start_colab = int(time.time())-5 |
| |
|
| | |
| | models_dir = f"{webui_path}/models/Stable-diffusion" |
| | vaes_dir = f"{webui_path}/models/VAE" |
| | embeddings_dir = f"{webui_path}/embeddings" |
| | loras_dir = f"{webui_path}/models/Lora" |
| | extensions_dir = f"{webui_path}/extensions" |
| | control_dir = f"{webui_path}/models/ControlNet" |
| |
|
| |
|
| | |
| | if not os.path.exists(webui_path): |
| | start_install = int(time.time()) |
| | print("⌚ Unpacking Stable Diffusion...", end='') |
| | with capture.capture_output() as cap: |
| | get_ipython().system('aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/vorstcavry/test/resolve/main/FULL_REPO.zip -o repo.zip') |
| | get_ipython().system('unzip -q -o repo.zip -d {webui_path}') |
| | get_ipython().system('rm -rf repo.zip') |
| |
|
| | get_ipython().run_line_magic('cd', '{root_path}') |
| | os.environ["SAFETENSORS_FAST_GPU"]='1' |
| | os.environ["CUDA_MODULE_LOADING"]="LAZY" |
| | os.environ["TF_CPP_MIN_LOG_LEVEL"] = "3" |
| | os.environ["PYTHONWARNINGS"] = "ignore" |
| |
|
| | get_ipython().system('echo -n {start_colab} > {webui_path}/static/colabTimer.txt') |
| | del cap |
| | install_time = timedelta(seconds=time.time()-start_install) |
| | print("\r🚀 Unpacking is complete! For","%02d:%02d:%02d ⚡\n" % (install_time.seconds / 3600, (install_time.seconds / 60) % 60, install_time.seconds % 60), end='', flush=True) |
| | else: |
| | print("🚀 All unpacked... Skip. ⚡") |
| | start_colab = float(open(f'{webui_path}/static/colabTimer.txt', 'r').read()) |
| | time_since_start = str(timedelta(seconds=time.time()-start_colab)).split('.')[0] |
| | print(f"⌚️ You have been conducting this session for - \033[33m{time_since_start}\033[0m") |
| |
|
| |
|
| | |
| | if latest_webui or latest_exstensions: |
| | action = "Updating WebUI and Extensions" if latest_webui and latest_exstensions else ("WebUI Update" if latest_webui else "Update Extensions") |
| | print(f"⌚️ {action}...", end='', flush=True) |
| | with capture.capture_output() as cap: |
| | get_ipython().system('git config --global user.email "you@example.com"') |
| | get_ipython().system('git config --global user.name "Your Name"') |
| |
|
| | |
| | if latest_webui: |
| | get_ipython().run_line_magic('cd', '{webui_path}') |
| | get_ipython().system('git restore .') |
| | get_ipython().system('git pull -X theirs --rebase --autostash') |
| |
|
| | |
| | if latest_exstensions: |
| | get_ipython().system('{\'for dir in \' + webui_path + \'/extensions/*/; do cd \\"$dir\\" && git reset --hard && git pull; done\'}') |
| |
|
| | |
| | get_ipython().run_line_magic('cd', '{webui_path}/extensions/Encrypt-Image') |
| | get_ipython().system('git reset --hard 376358d8854472b9ea50e9fc8800367d1ca51137 # stable commit :3') |
| | del cap |
| | print(f"\r✨ {action} Completed!") |
| |
|
| |
|
| | |
| | anxety_repos = "https://huggingface.co/NagisaNao/fast_repo/resolve/main" |
| |
|
| | with capture.capture_output() as cap: |
| | |
| | get_ipython().system("sed -i '9,37d' {webui_path}/extensions/Encrypt-Image/javascript/encrypt_images_info.js") |
| |
|
| | |
| | get_ipython().system('wget -O {webui_path}/extensions/additional-networks/scripts/metadata_editor.py {anxety_repos}/extensions/Additional-Networks/fix/metadata_editor.py') |
| | del cap |
| |
|
| |
|
| | |
| | if commit_hash: |
| | print('⏳ Time machine activation...', end="", flush=True) |
| | with capture.capture_output() as cap: |
| | get_ipython().run_line_magic('cd', '{webui_path}') |
| | get_ipython().system('git config --global user.email "you@example.com"') |
| | get_ipython().system('git config --global user.name "Your Name"') |
| | get_ipython().system('git reset --hard {commit_hash}') |
| | del cap |
| | print(f"\r⌛️ The time machine has been activated! Current commit: \033[34m{commit_hash}\033[0m") |
| |
|
| |
|
| | |
| | print("📦 Downloading models and stuff...", end='') |
| | model_list = { |
| | "1.Anime (by XpucT) + INP": [ |
| | {"url": "https://huggingface.co/XpucT/Anime/resolve/main/Anime_v2.safetensors", "name": "Anime_v2.safetensors"}, |
| | {"url": "https://huggingface.co/XpucT/Anime/resolve/main/Anime_v2-inpainting.safetensors", "name": "Anime_v2-inpainting.safetensors"} |
| | ], |
| | "2.BluMix [Anime] [V7] + INP": [ |
| | {"url": "https://civitai.com/api/download/models/361779", "name": "BluMix_v7.safetensors"}, |
| | {"url": "https://civitai.com/api/download/models/363850", "name": "BluMix_v7-inpainting.safetensors"} |
| | ], |
| | "3.Cetus-Mix [Anime] [V4] + INP": [ |
| | {"url": "https://civitai.com/api/download/models/130298", "name": "CetusMix_V4.safetensors"}, |
| | {"url": "https://civitai.com/api/download/models/139882", "name": "CetusMix_V4-inpainting.safetensors"} |
| | ], |
| | "4.Counterfeit [Anime] [V3] + INP": [ |
| | {"url": "https://civitai.com/api/download/models/125050", "name": "Counterfeit_V3.safetensors"}, |
| | {"url": "https://civitai.com/api/download/models/137911", "name": "Counterfeit_V3-inpainting.safetensors"} |
| | ], |
| | "5.CuteColor [Anime] [V3]": [ |
| | {"url": "https://civitai.com/api/download/models/138754", "name": "CuteColor_V3.safetensors"} |
| | ], |
| | "6.Dark-Sushi-Mix [Anime]": [ |
| | {"url": "https://civitai.com/api/download/models/101640", "name": "DarkSushiMix_2_5D.safetensors"}, |
| | {"url": "https://civitai.com/api/download/models/56071", "name": "DarkSushiMix_colorful.safetensors"} |
| | ], |
| | "7.Deliberate [Realism] [V6] + INP": [ |
| | {"url": "https://huggingface.co/XpucT/Deliberate/resolve/main/Deliberate_v6.safetensors", "name": "Deliberate_v6.safetensors"}, |
| | {"url": "https://huggingface.co/XpucT/Deliberate/resolve/main/Deliberate_v6-inpainting.safetensors", "name": "Deliberate_v6-inpainting.safetensors"} |
| | ], |
| | "8.Meina-Mix [Anime] [V11] + INP": [ |
| | {"url": "https://civitai.com/api/download/models/119057", "name": "MeinaMix_V11.safetensors"}, |
| | {"url": "https://civitai.com/api/download/models/120702", "name": "MeinaMix_V11-inpainting.safetensors"} |
| | ], |
| | "9.Mix-Pro [Anime] [V4] + INP": [ |
| | {"url": "https://civitai.com/api/download/models/125668", "name": "MixPro_V4.safetensors"}, |
| | {"url": "https://civitai.com/api/download/models/139878", "name": "MixPro_V4-inpainting.safetensors"} |
| | ] |
| | } |
| |
|
| | |
| | vae_list = { |
| | "1.Anime.vae": [ |
| | {"url": "https://civitai.com/api/download/models/131654", "name": "Anime.vae.safetensors"}, |
| | {"url": "https://civitai.com/api/download/models/131658", "name": "vae-ft-mse.vae.safetensors"} |
| | ], |
| | "2.Anything.vae": [{"url": "https://civitai.com/api/download/models/131656", "name": "Anything.vae.safetensors"}], |
| | "3.Blessed2.vae": [{"url": "https://civitai.com/api/download/models/142467", "name": "Blessed2.vae.safetensors"}], |
| | "4.ClearVae.vae": [{"url": "https://civitai.com/api/download/models/133362", "name": "ClearVae_23.vae.safetensors"}], |
| | "5.WD.vae": [{"url": "https://huggingface.co/NoCrypt/resources/resolve/main/VAE/wd.vae.safetensors", "name": "WD.vae.safetensors"}] |
| | } |
| |
|
| | controlnet_list = { |
| | "1.canny": [ |
| | {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/resolve/main/control_v11p_sd15_canny_fp16.safetensors", "name": "control_v11p_sd15_canny_fp16.safetensors"}, |
| | {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/raw/main/control_v11p_sd15_canny_fp16.yaml", "name": "control_v11p_sd15_canny_fp16.yaml"} |
| | ], |
| | "2.openpose": [ |
| | {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/resolve/main/control_v11p_sd15_openpose_fp16.safetensors", "name": "control_v11p_sd15_openpose_fp16.safetensors"}, |
| | {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/raw/main/control_v11p_sd15_openpose_fp16.yaml", "name": "control_v11p_sd15_openpose_fp16.yaml"} |
| | ], |
| | "3.depth": [ |
| | {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/resolve/main/control_v11f1p_sd15_depth_fp16.safetensors", "name": "control_v11f1p_sd15_depth_fp16.safetensors"}, |
| | {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/raw/main/control_v11f1p_sd15_depth_fp16.yaml", "name": "control_v11f1p_sd15_depth_fp16.yaml"}, |
| | {"url": "https://huggingface.co/NagisaNao/models/resolve/main/ControlNet_v11/control_v11p_sd15_depth_anything_fp16.safetensors", "name": "control_v11p_sd15_depth_anything_fp16.safetensors"} |
| | ], |
| | "4.normal_map": [ |
| | {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/resolve/main/control_v11p_sd15_normalbae_fp16.safetensors", "name": "control_v11p_sd15_normalbae_fp16.safetensors"}, |
| | {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/raw/main/control_v11p_sd15_normalbae_fp16.yaml", "name": "control_v11p_sd15_normalbae_fp16.yaml"} |
| | ], |
| | "5.mlsd": [ |
| | {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/resolve/main/control_v11p_sd15_mlsd_fp16.safetensors", "name": "control_v11p_sd15_mlsd_fp16.safetensors"}, |
| | {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/raw/main/control_v11p_sd15_mlsd_fp16.yaml", "name": "control_v11p_sd15_mlsd_fp16.yaml"} |
| | ], |
| | "6.lineart": [ |
| | {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/resolve/main/control_v11p_sd15_lineart_fp16.safetensors", "name": "control_v11p_sd15_lineart_fp16.safetensors"}, |
| | {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/resolve/main/control_v11p_sd15s2_lineart_anime_fp16.safetensors", "name": "control_v11p_sd15s2_lineart_anime_fp16.safetensors"}, |
| | {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/raw/main/control_v11p_sd15_lineart_fp16.yaml", "name": "control_v11p_sd15_lineart_fp16.yaml"}, |
| | {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/raw/main/control_v11p_sd15s2_lineart_anime_fp16.yaml", "name": "control_v11p_sd15s2_lineart_anime_fp16.yaml"} |
| | ], |
| | "7.soft_edge": [ |
| | {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/resolve/main/control_v11p_sd15_softedge_fp16.safetensors", "name": "control_v11p_sd15_softedge_fp16.safetensors"}, |
| | {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/raw/main/control_v11p_sd15_softedge_fp16.yaml", "name": "control_v11p_sd15_softedge_fp16.yaml"} |
| | ], |
| | "8.scribble": [ |
| | {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/resolve/main/control_v11p_sd15_scribble_fp16.safetensors", "name": "control_v11p_sd15_scribble_fp16.safetensors"}, |
| | {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/raw/main/control_v11p_sd15_scribble_fp16.yaml", "name": "control_v11p_sd15_scribble_fp16.yaml"} |
| | ], |
| | "9.segmentation": [ |
| | {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/resolve/main/control_v11p_sd15_seg_fp16.safetensors", "name": "control_v11p_sd15_seg_fp16.safetensors"}, |
| | {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/raw/main/control_v11p_sd15_seg_fp16.yaml", "name": "control_v11p_sd15_seg_fp16.yaml"} |
| | ], |
| | "10.shuffle": [ |
| | {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/resolve/main/control_v11e_sd15_shuffle_fp16.safetensors", "name": "control_v11e_sd15_shuffle_fp16.safetensors"}, |
| | {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/raw/main/control_v11e_sd15_shuffle_fp16.yaml", "name": "control_v11e_sd15_shuffle_fp16.yaml"} |
| | ], |
| | "11.tile": [ |
| | {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/resolve/main/control_v11f1e_sd15_tile_fp16.safetensors", "name": "control_v11f1e_sd15_tile_fp16.safetensors"}, |
| | {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/raw/main/control_v11f1e_sd15_tile_fp16.yaml", "name": "control_v11f1e_sd15_tile_fp16.yaml"} |
| | ], |
| | "12.inpaint": [ |
| | {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/resolve/main/control_v11p_sd15_inpaint_fp16.safetensors", "name": "control_v11p_sd15_inpaint_fp16.safetensors"}, |
| | {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/raw/main/control_v11p_sd15_inpaint_fp16.yaml", "name": "control_v11p_sd15_inpaint_fp16.yaml"} |
| | ], |
| | "13.instruct_p2p": [ |
| | {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/resolve/main/control_v11e_sd15_ip2p_fp16.safetensors", "name": "control_v11e_sd15_ip2p_fp16.safetensors"}, |
| | {"url": "https://huggingface.co/ckpt/ControlNet-v1-1/raw/main/control_v11e_sd15_ip2p_fp16.yaml", "name": "control_v11e_sd15_ip2p_fp16.yaml"} |
| | ] |
| | } |
| |
|
| | extension_repo = [] |
| | prefixes = { |
| | |
| | "model": [models_dir, "Model_url"], |
| | "vae": [vaes_dir, "Vae_url"], |
| | "lora": [loras_dir, "LoRA_url"], |
| | "embed": [embeddings_dir, "Embedding_url"], |
| | "extension": [extensions_dir, "Extensions_url"], |
| | "control": [control_dir, "ControlNet_url"] |
| | } |
| |
|
| | get_ipython().system('mkdir -p {models_dir} {vaes_dir} {loras_dir} {embeddings_dir} {extensions_dir} {control_dir}') |
| |
|
| | url = "" |
| | ControlNet_url = "" |
| | hf_token = optional_huggingface_token if optional_huggingface_token else "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" |
| | user_header = f"\"Authorization: Bearer {hf_token}\"" |
| |
|
| | ''' main download code ''' |
| |
|
| | def handle_manual(url): |
| | original_url = url |
| | url = url.split(':', 1)[1] |
| | file_name = re.search(r'\[(.*?)\]', url) |
| | file_name = file_name.group(1) if file_name else None |
| | if file_name: |
| | url = re.sub(r'\[.*?\]', '', url) |
| |
|
| | for prefix, (dir, _) in prefixes.items(): |
| | if original_url.startswith(f"{prefix}:"): |
| | if prefix != "extension": |
| | manual_download(url, dir, file_name=file_name) |
| | else: |
| | extension_repo.append((url, file_name)) |
| |
|
| | def manual_download(url, dst_dir, file_name): |
| | basename = url.split("/")[-1] if file_name is None else file_name |
| | header_option = f"--header={user_header}" |
| |
|
| | print("\033[32m---"*45 + f"\n\033[33mURL: \033[34m{url}\n\033[33mSAVE DIR: \033[34m{dst_dir}\n\033[33mFILE NAME: \033[34m{file_name}\033[32m\n~~~\033[0m") |
| |
|
| | |
| | civitai_token = "62c0c5956b2f9defbd844d754000180b" |
| | if 'civitai' in url and civitai_token: |
| | url = f"{url}?token={civitai_token}" |
| |
|
| | |
| | if 'drive.google' in url: |
| | if 'folders' in url: |
| | get_ipython().system('gdown --folder "{url}" -O {dst_dir} --fuzzy -c') |
| | else: |
| | if file_name: |
| | get_ipython().system('gdown "{url}" -O {dst_dir}/{file_name} --fuzzy -c') |
| | else: |
| | get_ipython().system('gdown "{url}" -O {dst_dir} --fuzzy -c') |
| | |
| | elif 'huggingface' in url: |
| | if '/blob/' in url: |
| | url = url.replace('/blob/', '/resolve/') |
| | if file_name: |
| | get_ipython().system('aria2c {header_option} --optimize-concurrent-downloads --console-log-level=error --summary-interval=10 -c -j5 -x16 -s16 -k1M -d {dst_dir} -o {basename} {url}') |
| | else: |
| | parsed_link = f'\n{url}\n\tout={unquote(url.split("/")[-1])}' |
| | get_ipython().system('echo -e "{parsed_link}" | aria2c {header_option} --console-log-level=error --summary-interval=10 -i- -j5 -x16 -s16 -k1M -c -d "{dst_dir}" -o {basename}') |
| | |
| | elif 'http' in url or 'magnet' in url: |
| | if file_name: |
| | get_ipython().system('aria2c --optimize-concurrent-downloads --console-log-level=error --summary-interval=10 -j5 -x16 -s16 -k1M -c -d {dst_dir} -o {file_name} {url}') |
| | else: |
| | parsed_link = '"{}"'.format(url) |
| | get_ipython().system('aria2c --optimize-concurrent-downloads --console-log-level=error --summary-interval=10 -j5 -x16 -s16 -k1M -c -d {dst_dir} -Z {parsed_link}') |
| |
|
| | def download(url): |
| | links_and_paths = url.split(',') |
| |
|
| | for link_or_path in links_and_paths: |
| | link_or_path = link_or_path.strip() |
| | if not link_or_path: |
| | continue |
| | if any(link_or_path.startswith(prefix.lower()) for prefix in prefixes): |
| | handle_manual(link_or_path) |
| | continue |
| |
|
| | url, dst_dir, file_name = link_or_path.split() |
| | manual_download(url, dst_dir, file_name) |
| |
|
| | ''' submodels - added urls ''' |
| |
|
| | submodels = [] |
| |
|
| | def add_submodels(selection, num_selection, model_dict, dst_dir): |
| | if selection == "none": |
| | return [] |
| | if selection == "ALL": |
| | all_models = [] |
| | for models in model_dict.values(): |
| | all_models.extend(models) |
| | selected_models = all_models |
| | else: |
| | selected_models = model_dict[selection] |
| | selected_nums = map(int, num_selection.replace(',', '').split()) |
| |
|
| | for num in selected_nums: |
| | if 1 <= num <= len(model_dict): |
| | name = list(model_dict)[num - 1] |
| | selected_models.extend(model_dict[name]) |
| |
|
| | unique_models = list({model['name']: model for model in selected_models}.values()) |
| |
|
| | for model in unique_models: |
| | model['dst_dir'] = dst_dir |
| |
|
| | return unique_models |
| |
|
| | submodels += add_submodels(Model, Model_Num, model_list, models_dir) |
| | submodels += add_submodels(Vae, Vae_Num, vae_list, vaes_dir) |
| | submodels += add_submodels(controlnet, "" if controlnet == "ALL" else controlnet_Num, controlnet_list, control_dir) |
| |
|
| | for submodel in submodels: |
| | if not Inpainting_Model and "inpainting" in submodel['name']: |
| | continue |
| | url += f"{submodel['url']} {submodel['dst_dir']} {submodel['name']}, " |
| |
|
| | ''' file.txt - added urls ''' |
| |
|
| | unique_urls = [] |
| |
|
| | def process_file_download(file_url): |
| | if file_url.startswith("http"): |
| | if "blob" in file_url: |
| | file_url = file_url.replace("blob", "raw") |
| | response = requests.get(file_url) |
| | lines = response.text.split('\n') |
| | else: |
| | with open(file_url, 'r') as file: |
| | lines = file.readlines() |
| |
|
| | current_tag = None |
| | for line in lines: |
| | if any(f'# {tag}' in line.lower() for tag in prefixes): |
| | current_tag = next((tag for tag in prefixes if tag in line.lower())) |
| |
|
| | urls = [url.strip() for url in line.split(',')] |
| | for url in urls: |
| | if url.startswith("http") and url not in unique_urls: |
| | globals()[prefixes[current_tag][1]] += ", " + url |
| | unique_urls.append(url) |
| |
|
| | |
| | if custom_file_urls: |
| | for custom_file_url in custom_file_urls.replace(',', '').split(): |
| | if not custom_file_url.endswith('.txt'): |
| | custom_file_url += '.txt' |
| | if not custom_file_url.startswith('http'): |
| | if not custom_file_url.startswith(root_path): |
| | custom_file_url = f'{root_path}/{custom_file_url}' |
| |
|
| | try: |
| | process_file_download(custom_file_url) |
| | except FileNotFoundError: |
| | pass |
| |
|
| | |
| | urls = [globals()[urls[1]] for urls in prefixes.values()] |
| | for i, prefix in enumerate(prefixes): |
| | if urls[i]: |
| | prefixed_urls = [f"{prefix}:{url}" for url in urls[i].replace(',', '').split()] |
| | if prefixed_urls: |
| | url += ", ".join(prefixed_urls) + ", " |
| |
|
| | if detailed_download == "on": |
| | print("\n\n\033[33m# ====== Detailed Download ====== #\n\033[0m") |
| | download(url) |
| | print("\n\033[33m# =============================== #\n\033[0m") |
| | else: |
| | with capture.capture_output() as cap: |
| | download(url) |
| | del cap |
| |
|
| | print("\r🏁 Download Complete!" + " "*15) |
| |
|
| |
|
| | |
| | get_ipython().system('find {webui_path} \\( -type d \\( -name ".ipynb_checkpoints" -o -name ".aria2" \\) -o -type f -name "*.aria2" \\) -exec rm -r {{}} \\; >/dev/null 2>&1') |
| |
|
| |
|
| | |
| | if len(extension_repo) > 0: |
| | print("✨ Installing custom extensions...", end='', flush=True) |
| | with capture.capture_output() as cap: |
| | for repo, repo_name in extension_repo: |
| | if not repo_name: |
| | repo_name = repo.split('/')[-1] |
| | get_ipython().system('cd {extensions_dir} && git clone {repo} {repo_name} && cd {repo_name} && git fetch') |
| | del cap |
| | print(f"\r📦 Installed '{len(extension_repo)}', Custom extensions!") |
| |
|
| |
|
| | |
| | if detailed_download == "off": |
| | print("\n\n\033[33mIf you don't see any downloaded files, enable the 'Detailed Downloads' feature in the widget.") |
| |
|
| | if any(not file.endswith('.txt') for file in os.listdir(models_dir)): |
| | print("\n\033[33m➤ Models\033[0m") |
| | get_ipython().system("find {models_dir}/ -mindepth 1 ! -name '*.txt' -printf '%f\\n'") |
| | if any(not file.endswith('.txt') for file in os.listdir(vaes_dir)): |
| | print("\n\033[33m➤ VAEs\033[0m") |
| | get_ipython().system("find {vaes_dir}/ -mindepth 1 ! -name '*.txt' -printf '%f\\n'") |
| | if any(not file.endswith('.txt') and not os.path.isdir(os.path.join(embeddings_dir, file)) for file in os.listdir(embeddings_dir)): |
| | print("\n\033[33m➤ Embeddings\033[0m") |
| | get_ipython().system("find {embeddings_dir}/ -mindepth 1 -maxdepth 1 \\( -name '*.pt' -or -name '*.safetensors' \\) -printf '%f\\n'") |
| | if any(not file.endswith('.txt') for file in os.listdir(loras_dir)): |
| | print("\n\033[33m➤ LoRAs\033[0m") |
| | get_ipython().system("find {loras_dir}/ -mindepth 1 ! -name '*.keep' -printf '%f\\n'") |
| | print(f"\n\033[33m➤ Extensions\033[0m") |
| | get_ipython().system("find {extensions_dir}/ -mindepth 1 -maxdepth 1 ! -name '*.txt' -printf '%f\\n'") |
| | if any(not file.endswith(('.txt', '.yaml')) for file in os.listdir(control_dir)): |
| | print("\n\033[33m➤ ControlNet\033[0m") |
| | get_ipython().system("find {control_dir}/ -mindepth 1 ! -name '*.yaml' -printf '%f\\n' | sed 's/^[^_]*_[^_]*_[^_]*_\\(.*\\)_fp16\\.safetensors$/\\1/'") |
| |
|
| |
|
| | |
| | |
| | files_umi = [ |
| | "https://huggingface.co/NagisaNao/fast_repo/resolve/main/extensions/UmiWildacrd/discord/200_pan_gen.txt", |
| | "https://huggingface.co/NagisaNao/fast_repo/resolve/main/extensions/UmiWildacrd/discord/150_bra_gen.txt" |
| | ] |
| | save_dir_path = f"{webui_path}/extensions/Umi-AI-Wildcards/wildcards/discord" |
| |
|
| | with capture.capture_output() as cap: |
| | for file in files_umi: |
| | get_ipython().system('aria2c --optimize-concurrent-downloads --console-log-level=error --summary-interval=10 -j5 -x16 -s16 -k1M -c -d {save_dir_path} {file}') |
| | del cap |
| |
|
| |
|