Spaces:
Running
Running
| import os | |
| from IPython.display import clear_output | |
| from subprocess import call, getoutput, Popen, run | |
| import time | |
| import ipywidgets as widgets | |
| import requests | |
| import sys | |
| import fileinput | |
| from torch.hub import download_url_to_file | |
| from urllib.parse import urlparse, parse_qs, unquote | |
| import re | |
| import six | |
| import gdown | |
| from urllib.request import urlopen, Request | |
| import tempfile | |
| from tqdm import tqdm | |
| from bs4 import BeautifulSoup | |
| import zipfile | |
| def Deps(force_reinstall): | |
| # Определяем путь к файлу-маркеру | |
| #marker_file = '/workspace/setup_complete' | |
| # if not force_reinstall and os.path.exists(marker_file): | |
| # ntbks() | |
| # print('[1;32mModules and notebooks updated, dependencies already installed') | |
| # os.environ['TORCH_HOME'] = '/workspace/cache/torch' | |
| # os.environ['PYTHONWARNINGS'] = 'ignore' | |
| # call("pip install controlnet_aux --root-user-action=ignore --disable-pip-version-check", shell=True, stdout=open('/dev/null', 'w')) | |
| # call("pip install diskcache --root-user-action=ignore --disable-pip-version-check", shell=True, stdout=open('/dev/null', 'w')) | |
| # call("pip install pillow-avif-plugin --root-user-action=ignore --disable-pip-version-check", shell=True, stdout=open('/dev/null', 'w')) | |
| # call('pip install --root-user-action=ignore --disable-pip-version-check -qq gradio==3.41.2', shell=True, stdout=open('/dev/null', 'w')) | |
| # call("pip install pyre-extensions==0.0.29 --root-user-action=ignore --disable-pip-version-check", shell=True, stdout=open('/dev/null', 'w')) | |
| # clear_output() | |
| # done() | |
| # else: | |
| call('pip install --root-user-action=ignore --disable-pip-version-check --no-deps -qq gdown PyWavelets numpy==1.23.5 accelerate==0.12.0 --force-reinstall', shell=True, stdout=open('/dev/null', 'w')) | |
| if os.path.exists('deps'): | |
| call("rm -r deps", shell=True) | |
| if os.path.exists('diffusers'): | |
| call("rm -r diffusers", shell=True) | |
| if not os.path.exists('cache'): | |
| call('mkdir cache', shell=True) | |
| if not os.path.exists('deps'): | |
| call('mkdir deps', shell=True) | |
| os.chdir('deps') | |
| dwn("https://huggingface.co/spaces/stlaurentjr/RNPD/resolve/main/deps/rnpddeps-t2.tar.zst", "/workspace/deps/rnpddeps-t2.tar.zst", "Installing dependencies") | |
| else: | |
| os.chdir('deps') | |
| call('tar -C / --zstd -xf rnpddeps-t2.tar.zst', shell=True, stdout=open('/dev/null', 'w')) | |
| call("sed -i 's@~/.cache@/workspace/cache@' /usr/local/lib/python3.10/dist-packages/transformers/utils/hub.py", shell=True) | |
| os.chdir('/workspace') | |
| call("pip install pyre-extensions==0.0.29 --root-user-action=ignore --disable-pip-version-check", shell=True, stdout=open('/dev/null', 'w')) | |
| call("pip install controlnet_aux --root-user-action=ignore --disable-pip-version-check", shell=True, stdout=open('/dev/null', 'w')) | |
| call("pip install diskcache --root-user-action=ignore --disable-pip-version-check", shell=True, stdout=open('/dev/null', 'w')) | |
| call("pip install pillow-avif-plugin --root-user-action=ignore --disable-pip-version-check", shell=True, stdout=open('/dev/null', 'w')) | |
| call("git clone --depth 1 -q --branch main https://github.com/TheLastBen/diffusers", shell=True, stdout=open('/dev/null', 'w')) | |
| call('pip install --root-user-action=ignore --disable-pip-version-check -qq gradio==3.41.2', shell=True, stdout=open('/dev/null', 'w')) | |
| #call("rm -r deps", shell=True) | |
| os.chdir('/workspace') | |
| os.environ['TORCH_HOME'] = '/workspace/cache/torch' | |
| os.environ['PYTHONWARNINGS'] = 'ignore' | |
| call("sed -i 's@text = _formatwarnmsg(msg)@text =\"\"@g' /usr/lib/python3.10/warnings.py", shell=True) | |
| # Создаём файл-маркер после успешного выполнения установок | |
| #with open(marker_file, 'w') as f: | |
| # f.write('Setup complete') | |
| clear_output() | |
| done() | |
| def dwn(url, dst, msg): | |
| file_size = None | |
| req = Request(url, headers={"User-Agent": "torch.hub"}) | |
| u = urlopen(req) | |
| meta = u.info() | |
| if hasattr(meta, 'getheaders'): | |
| content_length = meta.getheaders("Content-Length") | |
| else: | |
| content_length = meta.get_all("Content-Length") | |
| if content_length is not None and len(content_length) > 0: | |
| file_size = int(content_length[0]) | |
| with tqdm(total=file_size, disable=False, mininterval=0.5, | |
| bar_format=msg+' |{bar:20}| {percentage:3.0f}%') as pbar: | |
| with open(dst, "wb") as f: | |
| while True: | |
| buffer = u.read(8192) | |
| if len(buffer) == 0: | |
| break | |
| f.write(buffer) | |
| pbar.update(len(buffer)) | |
| f.close() | |
| def ntbks(): | |
| os.chdir('/workspace') | |
| if not os.path.exists('Latest_Notebooks'): | |
| call('mkdir Latest_Notebooks', shell=True) | |
| else: | |
| call('rm -r Latest_Notebooks', shell=True) | |
| call('mkdir Latest_Notebooks', shell=True) | |
| os.chdir('/workspace/Latest_Notebooks') | |
| call('wget -q -i https://huggingface.co/datasets/TheLastBen/RNPD/raw/main/Notebooks.txt', shell=True) | |
| call('rm Notebooks.txt', shell=True) | |
| os.chdir('/workspace') | |
| def repo(Huggingface_token_optional): | |
| from slugify import slugify | |
| from huggingface_hub import HfApi, CommitOperationAdd, create_repo | |
| os.chdir('/workspace') | |
| if Huggingface_token_optional!="": | |
| username = HfApi().whoami(Huggingface_token_optional)["name"] | |
| backup=f"https://huggingface.co/datasets/{username}/fast-stable-diffusion/resolve/main/sd_backup_rnpd.tar.zst" | |
| headers = {"Authorization": f"Bearer {Huggingface_token_optional}"} | |
| response = requests.head(backup, headers=headers) | |
| if response.status_code == 302: | |
| print('[1;33mRestoring the SD folder...') | |
| open('/workspace/sd_backup_rnpd.tar.zst', 'wb').write(requests.get(backup, headers=headers).content) | |
| call('tar --zstd -xf sd_backup_rnpd.tar.zst', shell=True) | |
| call('rm sd_backup_rnpd.tar.zst', shell=True) | |
| else: | |
| print('[1;33mBackup not found, using a fresh/existing repo...') | |
| time.sleep(2) | |
| if not os.path.exists('/workspace/sd/stablediffusiond'): #reset later | |
| call('wget -q -O sd_mrep.tar.zst https://huggingface.co/TheLastBen/dependencies/resolve/main/sd_mrep.tar.zst', shell=True) | |
| call('tar --zstd -xf sd_mrep.tar.zst', shell=True) | |
| call('rm sd_mrep.tar.zst', shell=True) | |
| os.chdir('/workspace/sd') | |
| if not os.path.exists('stable-diffusion-webui'): | |
| call('git clone -q --depth 1 --branch master https://github.com/AUTOMATIC1111/stable-diffusion-webui', shell=True) | |
| else: | |
| print('[1;33mInstalling/Updating the repo...') | |
| os.chdir('/workspace') | |
| if not os.path.exists('/workspace/sd/stablediffusiond'): #reset later | |
| call('wget -q -O sd_mrep.tar.zst https://huggingface.co/TheLastBen/dependencies/resolve/main/sd_mrep.tar.zst', shell=True) | |
| call('tar --zstd -xf sd_mrep.tar.zst', shell=True) | |
| call('rm sd_mrep.tar.zst', shell=True) | |
| os.chdir('/workspace/sd') | |
| if not os.path.exists('stable-diffusion-webui'): | |
| call('git clone -q --depth 1 --branch master https://github.com/AUTOMATIC1111/stable-diffusion-webui', shell=True) | |
| os.chdir('/workspace/sd/stable-diffusion-webui/') | |
| call('git reset --hard', shell=True) | |
| print('[1;32m') | |
| call('git pull', shell=True) | |
| os.makedirs('/workspace/sd/stable-diffusion-webui/repositories', exist_ok=True) | |
| call('git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui-assets /workspace/sd/stable-diffusion-webui/repositories/stable-diffusion-webui-assets', shell=True, stdout=open('/dev/null', 'w'), stderr=open('/dev/null', 'w')) | |
| os.chdir('/workspace') | |
| clear_output() | |
| done() | |
| def mdl(Original_Model_Version, Path_to_MODEL, MODEL_LINK): | |
| import gdown | |
| src=getsrc(MODEL_LINK) | |
| if not os.path.exists("/workspace/sd/stable-diffusion-webui/models/VAE"): | |
| call("mkdir -p /workspace/sd/stable-diffusion-webui/models/VAE", shell=True) | |
| # Получаем список файлов в директории /workspace/auto-VAE | |
| files = os.listdir("/workspace/auto-VAE") | |
| for file in files: | |
| source_path = os.path.join("/workspace/auto-VAE", file) | |
| target_path = os.path.join( | |
| "/workspace/sd/stable-diffusion-webui/models/VAE", file | |
| ) | |
| # Проверяем, существует ли уже символическая ссылка | |
| if not os.path.exists(target_path): | |
| call(f"ln -s {source_path} {target_path}", shell=True) | |
| if not os.path.exists('/workspace/sd/stable-diffusion-webui/models/Stable-diffusion/SDv1-5.ckpt'): | |
| call('ln -s /workspace/auto-models/* /workspace/sd/stable-diffusion-webui/models/Stable-diffusion', shell=True) | |
| if not os.path.exists("/workspace/sd/stable-diffusion-webui/models/Lora"): | |
| call("mkdir -p /workspace/sd/stable-diffusion-webui/models/Lora", shell=True) | |
| call( | |
| "ln -s /workspace/auto-lora/* /workspace/sd/stable-diffusion-webui/models/Lora", | |
| shell=True, | |
| ) | |
| if Path_to_MODEL !='': | |
| if os.path.exists(str(Path_to_MODEL)): | |
| print('[1;32mUsing the custom model') | |
| model=Path_to_MODEL | |
| else: | |
| print('[1;31mWrong path, check that the path to the model is correct') | |
| elif MODEL_LINK !="": | |
| if src=='civitai': | |
| modelname=get_name(MODEL_LINK, False) | |
| model=f'/workspace/sd/stable-diffusion-webui/models/Stable-diffusion/{modelname}' | |
| if not os.path.exists(model): | |
| dwn(MODEL_LINK, model, 'Downloading the custom model') | |
| clear_output() | |
| else: | |
| print('[1;33mModel already exists') | |
| elif src=='gdrive': | |
| modelname=get_name(MODEL_LINK, True) | |
| model=f'/workspace/sd/stable-diffusion-webui/models/Stable-diffusion/{modelname}' | |
| if not os.path.exists(model): | |
| gdown.download(url=MODEL_LINK, output=model, quiet=False, fuzzy=True) | |
| clear_output() | |
| else: | |
| print('[1;33mModel already exists') | |
| else: | |
| modelname=os.path.basename(MODEL_LINK) | |
| model=f'/workspace/sd/stable-diffusion-webui/models/Stable-diffusion/{modelname}' | |
| if not os.path.exists(model): | |
| gdown.download(url=MODEL_LINK, output=model, quiet=False, fuzzy=True) | |
| clear_output() | |
| else: | |
| print('[1;33mModel already exists') | |
| if os.path.exists(model) and os.path.getsize(model) > 1810671599: | |
| print('[1;32mModel downloaded, using the custom model.') | |
| else: | |
| call('rm '+model, shell=True, stdout=open('/dev/null', 'w'), stderr=open('/dev/null', 'w')) | |
| print('[1;31mWrong link, check that the link is valid') | |
| else: | |
| if Original_Model_Version == "v1.5": | |
| model="/workspace/sd/stable-diffusion-webui/models/Stable-diffusion/SDv1-5.ckpt" | |
| print('[1;32mUsing the original V1.5 model') | |
| elif Original_Model_Version == "v2-512": | |
| model='/workspace/sd/stable-diffusion-webui/models/Stable-diffusion/SDv2-512.ckpt' | |
| if not os.path.exists('/workspace/sd/stable-diffusion-webui/models/Stable-diffusion/SDv2-512.ckpt'): | |
| print('[1;33mDownloading the V2-512 model...') | |
| call('gdown -O '+model+' https://huggingface.co/stabilityai/stable-diffusion-2-1-base/resolve/main/v2-1_512-nonema-pruned.ckpt', shell=True) | |
| clear_output() | |
| print('[1;32mUsing the original V2-512 model') | |
| elif Original_Model_Version == "v2-768": | |
| model="/workspace/sd/stable-diffusion-webui/models/Stable-diffusion/SDv2-768.ckpt" | |
| print('[1;32mUsing the original V2-768 model') | |
| elif Original_Model_Version == "SDXL": | |
| model="/workspace/sd/stable-diffusion-webui/models/Stable-diffusion/sd_xl_base_1.0.safetensors" | |
| print('[1;32mUsing the original SDXL model') | |
| else: | |
| model="/workspace/sd/stable-diffusion-webui/models/Stable-diffusion" | |
| print('[1;31mWrong model version, try again') | |
| try: | |
| model | |
| except: | |
| model="/workspace/sd/stable-diffusion-webui/models/Stable-diffusion" | |
| return model | |
| def modeldwn(model_LINK): | |
| if model_LINK == "": | |
| print("[1;33mNothing to do") | |
| else: | |
| os.makedirs( | |
| "/workspace/sd/stable-diffusion-webui/models/Stable-diffusion", | |
| exist_ok=True, | |
| ) | |
| src = getsrc(model_LINK) | |
| if src == "civitai": | |
| modelname = get_name(model_LINK, False) | |
| loramodel = f"/workspace/sd/stable-diffusion-webui/models/Stable-diffusion/{modelname}" | |
| if not os.path.exists(loramodel): | |
| dwn(model_LINK, loramodel, "Downloading the LoRA model") | |
| clear_output() | |
| else: | |
| print("[1;33mModel already exists") | |
| elif src == "gdrive": | |
| modelname = get_true_name(model_LINK) | |
| loramodel = f"/workspace/sd/stable-diffusion-webui/models/Stable-diffusion/{modelname}" | |
| if not os.path.exists(loramodel): | |
| gdown.download( | |
| url=model_LINK.replace("/file/d/", "/uc?id=").replace("/view", ""), | |
| output=loramodel, | |
| quiet=False, | |
| ) | |
| clear_output() | |
| else: | |
| print("[1;33mModel already exists") | |
| else: | |
| modelname = os.path.basename(model_LINK) | |
| loramodel = f"/workspace/sd/stable-diffusion-webui/models/Stable-diffusion/{modelname}" | |
| if not os.path.exists(loramodel): | |
| gdown.download( | |
| url=model_LINK, output=loramodel, quiet=False, fuzzy=True | |
| ) | |
| clear_output() | |
| else: | |
| print("[1;33mModel already exists") | |
| if os.path.exists(loramodel): | |
| print("[1;32mCheckpoints downloaded") | |
| else: | |
| print("[1;31mWrong link, check that the link is valid") | |
| def loradwn(LoRA_LINK): | |
| if LoRA_LINK == "": | |
| print("[1;33mNothing to do") | |
| else: | |
| os.makedirs("/workspace/sd/stable-diffusion-webui/models/Lora", exist_ok=True) | |
| src = getsrc(LoRA_LINK) | |
| if src == "civitai": | |
| modelname = get_name(LoRA_LINK, False) | |
| loramodel = f"/workspace/sd/stable-diffusion-webui/models/Lora/{modelname}" | |
| if not os.path.exists(loramodel): | |
| dwn(LoRA_LINK, loramodel, "Downloading the LoRA model") | |
| clear_output() | |
| else: | |
| print("[1;33mModel already exists") | |
| elif src == "gdrive": | |
| modelname = get_true_name(LoRA_LINK) | |
| loramodel = f"/workspace/sd/stable-diffusion-webui/models/Lora/{modelname}" | |
| if not os.path.exists(loramodel): | |
| gdown.download( | |
| url=LoRA_LINK.replace("/file/d/", "/uc?id=").replace("/view", ""), | |
| output=loramodel, | |
| quiet=False, | |
| ) | |
| clear_output() | |
| else: | |
| print("[1;33mModel already exists") | |
| else: | |
| modelname = os.path.basename(LoRA_LINK) | |
| loramodel = f"/workspace/sd/stable-diffusion-webui/models/Lora/{modelname}" | |
| if not os.path.exists(loramodel): | |
| gdown.download(url=LoRA_LINK, output=loramodel, quiet=False, fuzzy=True) | |
| clear_output() | |
| else: | |
| print("[1;33mModel already exists") | |
| if os.path.exists(loramodel): | |
| print("[1;32mLoRA downloaded") | |
| else: | |
| print("[1;31mWrong link, check that the link is valid") | |
| def CNet(ControlNet_Model, ControlNet_XL_Model): | |
| def download(url, model_dir): | |
| try: | |
| filename = os.path.basename(urlparse(url).path) | |
| pth = os.path.abspath(os.path.join(model_dir, filename)) | |
| if not os.path.exists(pth): | |
| print("Downloading: " + os.path.basename(url)) | |
| download_url_to_file(url, pth, hash_prefix=None, progress=True) | |
| else: | |
| print(f"[1;32mThe model {filename} already exists[0m") | |
| except Exception as e: | |
| print(f"Ошибка при скачивании {url}: {e}") | |
| wrngv1 = False | |
| os.chdir("/workspace/sd/stable-diffusion-webui/extensions") | |
| if not os.path.exists("sd-webui-controlnet"): | |
| call( | |
| "git clone https://github.com/Mikubill/sd-webui-controlnet.git", shell=True | |
| ) | |
| os.chdir("/workspace") | |
| else: | |
| os.chdir("sd-webui-controlnet") | |
| call( | |
| "git reset --hard", | |
| shell=True, | |
| stdout=open("/dev/null", "w"), | |
| stderr=open("/dev/null", "w"), | |
| ) | |
| call( | |
| "git pull", | |
| shell=True, | |
| stdout=open("/dev/null", "w"), | |
| stderr=open("/dev/null", "w"), | |
| ) | |
| os.chdir("/workspace") | |
| mdldir = ( | |
| "/workspace/sd/stable-diffusion-webui/extensions/sd-webui-controlnet/models" | |
| ) | |
| call( | |
| "ln -s /workspace/auto-controlnet-models/* /workspace/sd/stable-diffusion-webui/extensions/sd-webui-controlnet/models", | |
| shell=True, | |
| ) | |
| for filename in os.listdir(mdldir): | |
| if "_sd14v1" in filename: | |
| renamed = re.sub("_sd14v1", "-fp16", filename) | |
| os.rename(os.path.join(mdldir, filename), os.path.join(mdldir, renamed)) | |
| call( | |
| "wget -q -O CN_models.txt https://huggingface.co/spaces/stlaurentjr/RNPD/raw/main/config/CN_models.txt", | |
| shell=True, | |
| ) | |
| call( | |
| "wget -q -O CN_models_XL.txt https://github.com/TheLastBen/fast-stable-diffusion/raw/main/AUTOMATIC1111_files/CN_models_XL.txt", | |
| shell=True, | |
| ) | |
| with open("CN_models.txt", "r") as f: | |
| mdllnk = f.read().splitlines() | |
| with open("CN_models_XL.txt", "r") as d: | |
| mdllnk_XL = d.read().splitlines() | |
| call("rm CN_models.txt CN_models_XL.txt", shell=True) | |
| os.chdir("/workspace") | |
| if ControlNet_Model == "All" or ControlNet_Model == "all": | |
| for lnk in mdllnk: | |
| download(lnk, mdldir) | |
| clear_output() | |
| elif ControlNet_Model == "17": | |
| mdllnk = list(filter(lambda x: "t2i" in x, mdllnk)) | |
| for lnk in mdllnk: | |
| download(lnk, mdldir) | |
| clear_output() | |
| elif ( | |
| ControlNet_Model.isdigit() | |
| and int(ControlNet_Model) - 1 < 16 | |
| and int(ControlNet_Model) > 0 | |
| ): | |
| download(mdllnk[int(ControlNet_Model) - 1], mdldir) | |
| clear_output() | |
| elif ControlNet_Model == "none": | |
| pass | |
| clear_output() | |
| else: | |
| print("[1;31mWrong ControlNet V1 choice, try again") | |
| wrngv1 = True | |
| if ControlNet_XL_Model == "All" or ControlNet_XL_Model == "all": | |
| for lnk_XL in mdllnk_XL: | |
| download(lnk_XL, mdldir) | |
| if not wrngv1: | |
| clear_output() | |
| done() | |
| elif ControlNet_XL_Model.isdigit() and int(ControlNet_XL_Model) - 1 < 5: | |
| download(mdllnk_XL[int(ControlNet_XL_Model) - 1], mdldir) | |
| if not wrngv1: | |
| clear_output() | |
| done() | |
| elif ControlNet_XL_Model == "none": | |
| pass | |
| if not wrngv1: | |
| clear_output() | |
| done() | |
| else: | |
| print("[1;31mWrong ControlNet XL choice, try again") | |
| def sd(User, Password, model): | |
| import gradio | |
| gradio.close_all() | |
| auth=f"--gradio-auth {User}:{Password}" | |
| if User =="" or Password=="": | |
| auth="" | |
| call('wget -q -O /usr/local/lib/python3.10/dist-packages/gradio/blocks.py https://raw.githubusercontent.com/TheLastBen/fast-stable-diffusion/main/AUTOMATIC1111_files/blocks.py', shell=True) | |
| os.chdir('/workspace/sd/stable-diffusion-webui/modules') | |
| call("sed -i 's@possible_sd_paths =.*@possible_sd_paths = [\"/workspace/sd/stablediffusion\"]@' /workspace/sd/stable-diffusion-webui/modules/paths.py", shell=True) | |
| call("sed -i 's@\.\.\/@src/@g' /workspace/sd/stable-diffusion-webui/modules/paths.py", shell=True) | |
| call("sed -i 's@src\/generative-models@generative-models@g' /workspace/sd/stable-diffusion-webui/modules/paths.py", shell=True) | |
| call("sed -i 's@\[\"sd_model_checkpoint\"\]@\[\"sd_model_checkpoint\", \"sd_vae\", \"CLIP_stop_at_last_layers\", \"inpainting_mask_weight\", \"initial_noise_multiplier\"\]@g' /workspace/sd/stable-diffusion-webui/modules/shared.py", shell=True) | |
| call("sed -i 's@print(\"No module.*@@' /workspace/sd/stablediffusion/ldm/modules/diffusionmodules/model.py", shell=True) | |
| os.chdir('/workspace/sd/stable-diffusion-webui') | |
| clear_output() | |
| podid=os.environ.get('RUNPOD_POD_ID') | |
| localurl=f"{podid}-3001.proxy.runpod.net" | |
| for line in fileinput.input('/usr/local/lib/python3.10/dist-packages/gradio/blocks.py', inplace=True): | |
| if line.strip().startswith('self.server_name ='): | |
| line = f' self.server_name = "{localurl}"\n' | |
| if line.strip().startswith('self.protocol = "https"'): | |
| line = ' self.protocol = "https"\n' | |
| if line.strip().startswith('if self.local_url.startswith("https") or self.is_colab'): | |
| line = '' | |
| if line.strip().startswith('else "http"'): | |
| line = '' | |
| sys.stdout.write(line) | |
| if model=="": | |
| mdlpth="" | |
| else: | |
| if os.path.isfile(model): | |
| mdlpth="--ckpt "+model | |
| else: | |
| mdlpth="--ckpt-dir "+model | |
| vae_path = "--vae-path /workspace/sd/stable-diffusion-webui/models/VAE/vae-ft-mse-840000-ema-pruned.safetensors" | |
| configf="--disable-console-progressbars --no-half-vae --disable-safe-unpickle --api --no-download-sd-model --opt-sdp-attention --enable-insecure-extension-access --skip-version-check --listen --port 3000 "+auth+" "+mdlpth+" "+vae_path | |
| return configf | |
| def save(Huggingface_Write_token): | |
| from slugify import slugify | |
| from huggingface_hub import HfApi, CommitOperationAdd, create_repo | |
| if Huggingface_Write_token=="": | |
| print('[1;31mA huggingface write token is required') | |
| else: | |
| os.chdir('/workspace') | |
| if os.path.exists('sd'): | |
| call('tar --exclude="stable-diffusion-webui/models/*/*" --exclude="sd-webui-controlnet/models/*" --zstd -cf sd_backup_rnpd.tar.zst sd', shell=True) | |
| api = HfApi() | |
| username = api.whoami(token=Huggingface_Write_token)["name"] | |
| repo_id = f"{username}/{slugify('fast-stable-diffusion')}" | |
| print("[1;32mBacking up...") | |
| operations = [CommitOperationAdd(path_in_repo="sd_backup_rnpd.tar.zst", path_or_fileobj="/workspace/sd_backup_rnpd.tar.zst")] | |
| create_repo(repo_id,private=True, token=Huggingface_Write_token, exist_ok=True, repo_type="dataset") | |
| api.create_commit( | |
| repo_id=repo_id, | |
| repo_type="dataset", | |
| operations=operations, | |
| commit_message="SD folder Backup", | |
| token=Huggingface_Write_token | |
| ) | |
| call('rm sd_backup_rnpd.tar.zst', shell=True) | |
| clear_output() | |
| done() | |
| else: | |
| print('[1;33mNothing to backup') | |
| def download_and_install_config(): | |
| target_directory = "/workspace/sd/stable-diffusion-webui/" | |
| config_url = ( | |
| "https://huggingface.co/spaces/stlaurentjr/RNPD/raw/main/config/config.json" | |
| ) | |
| config_file_path = os.path.join(target_directory, "config.json") | |
| # Check if the config file already exists | |
| if not os.path.exists(config_file_path): | |
| # Change the directory | |
| os.chdir(target_directory) | |
| # Download the file using curl command | |
| call(f"curl -o config.json {config_url}", shell=True) | |
| print(f"Config file downloaded successfully.") | |
| else: | |
| print("Config file already exists, download skipped.") | |
| def InstallDeforum(): | |
| # Переход в директорию расширений | |
| os.chdir("/workspace/sd/stable-diffusion-webui/extensions") | |
| # Проверка наличия директории с расширением | |
| if not os.path.exists("deforum-for-automatic1111-webui"): | |
| # Клонирование репозитория, если он не существует | |
| call( | |
| "git clone https://github.com/deforum-art/sd-webui-deforum.git", shell=True | |
| ) | |
| # Возврат в корневую директорию | |
| os.chdir("/workspace") | |
| else: | |
| # Если директория существует, переходим в нее | |
| # os.chdir('deforum-for-automatic1111-webui') | |
| # Сброс изменений и обновление репозитория | |
| # call('git reset --hard', shell=True, stdout=open(os.devnull, 'w'), stderr=open(os.devnull, 'w')) | |
| # call('git pull', shell=True, stdout=open(os.devnull, 'w'), stderr=open(os.devnull, 'w')) | |
| # Возврат в корневую директорию | |
| os.chdir("/workspace") | |
| def InstallReActor(): | |
| # Переход в директорию расширений | |
| os.chdir("/workspace/sd/stable-diffusion-webui/extensions") | |
| # Проверка наличия директории с расширением | |
| if not os.path.exists("sd-webui-reactor"): | |
| # Установка библиотек | |
| from subprocess import call, DEVNULL | |
| call( | |
| 'pip install "onnxruntime-gpu>=1.16.1"', | |
| shell=True | |
| ) | |
| # Клонирование репозитория, если он не существует | |
| call( | |
| "git clone https://github.com/Gourieff/sd-webui-reactor.git", | |
| shell=True, | |
| ) | |
| # Создание папки под модели | |
| call( | |
| "mkdir /workspace/sd/stable-diffusion-webui/models/insightface", | |
| shell=True | |
| ) | |
| os.chdir("/workspace/sd/stable-diffusion-webui/models/insightface") | |
| # Скачивание модели для reActor | |
| call( | |
| "wget https://github.com/facefusion/facefusion-assets/releases/download/models/inswapper_128.onnx", | |
| shell=True, | |
| stdout=DEVNULL, | |
| stderr=DEVNULL | |
| ) | |
| # Вовзрат в корневую директорию | |
| clear_output() | |
| os.chdir("/workspace") | |
| else: | |
| #Возврат в корневую директорию | |
| os.chdir("/workspace") | |
| def InstallAnimateDiff(): | |
| # Переход в директорию расширений | |
| os.chdir("/workspace/sd/stable-diffusion-webui/extensions") | |
| # Проверка наличия директории с расширением | |
| if not os.path.exists("sd-webui-animatediff"): | |
| from subprocess import call, DEVNULL | |
| # Клонирование репозитория, если он не существует | |
| call( | |
| "git clone https://github.com/continue-revolution/sd-webui-animatediff.git", | |
| shell=True, | |
| ) | |
| # Переход в папку с моделями | |
| os.chdir( | |
| "/workspace/sd/stable-diffusion-webui/extensions/sd-webui-animatediff/model" | |
| ) | |
| # Скачивание моделей для animatediff | |
| call( | |
| "wget https://huggingface.co/guoyww/animatediff/resolve/refs%2Fpr%2F3/mm_sd_v15_v2.ckpt", | |
| shell=True, | |
| stdout=DEVNULL, | |
| stderr=DEVNULL | |
| ) | |
| # call( | |
| # "wget https://huggingface.co/manshoety/AD_Stabilized_Motion/resolve/main/mm-Stabilized_high.pth", | |
| # shell=True, | |
| # stdout=DEVNULL, | |
| # stderr=DEVNULL | |
| # ) | |
| # Вовзрат в корневую директорию | |
| clear_output() | |
| os.chdir("/workspace") | |
| else: | |
| # Возврат в корневую директорию | |
| os.chdir("/workspace") | |
| def InstallWildCards(): | |
| # Путь к целевой директории | |
| target_dir = "/workspace/sd/stable-diffusion-webui/extensions/stable-diffusion-webui-wildcards/wildcards/" | |
| # Перемещаемся в директорию расширений | |
| os.chdir("/workspace/sd/stable-diffusion-webui/extensions") | |
| if not os.path.exists("stable-diffusion-webui-wildcards"): | |
| # Клонирование репозитория, если он ещё не существует | |
| call( | |
| "git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui-wildcards.git", | |
| shell=True, | |
| ) | |
| # Перемещаемся в клонированный репозиторий | |
| os.chdir("stable-diffusion-webui-wildcards") | |
| # Скачиваем файл по ID | |
| gdown.download( | |
| id="1sY9Yv29cCYZuxBvszkmLVgw--aRdwT1P", output="wildcards.zip", quiet=False | |
| ) | |
| # Создаем целевую директорию, если она ещё не существует | |
| os.makedirs(target_dir, exist_ok=True) | |
| # Распаковываем архив | |
| with zipfile.ZipFile("wildcards.zip", "r") as zip_ref: | |
| zip_ref.extractall(target_dir) | |
| else: | |
| # Если репозиторий уже существует, обновляем его | |
| os.chdir("stable-diffusion-webui-wildcards") | |
| call( | |
| "git reset --hard", | |
| shell=True, | |
| stdout=open(os.devnull, "w"), | |
| stderr=open(os.devnull, "w"), | |
| ) | |
| call( | |
| "git pull", | |
| shell=True, | |
| stdout=open(os.devnull, "w"), | |
| stderr=open(os.devnull, "w"), | |
| ) | |
| # Возвращаемся в исходную рабочую директорию | |
| os.chdir("/workspace") | |
| def getsrc(url): | |
| parsed_url = urlparse(url) | |
| if parsed_url.netloc == "civitai.com": | |
| src = "civitai" | |
| elif parsed_url.netloc == "drive.google.com": | |
| src = "gdrive" | |
| elif parsed_url.netloc == "huggingface.co": | |
| src = "huggingface" | |
| else: | |
| src = "others" | |
| return src | |
| def get_true_name(url): | |
| response = requests.get(url) | |
| soup = BeautifulSoup(response.text, "html.parser") | |
| title_tag = soup.find("title") | |
| if title_tag: | |
| title_text = title_tag.text | |
| # Извлечение имени файла из тега title (предполагая, что имя файла указано в теге title) | |
| file_name = title_text.split(" - ")[0] | |
| return file_name | |
| else: | |
| raise RuntimeError("Could not find the title tag in the HTML") | |
| def get_name(url, gdrive): | |
| from gdown.download import get_url_from_gdrive_confirmation | |
| if not gdrive: | |
| response = requests.get(url, allow_redirects=False) | |
| if "Location" in response.headers: | |
| redirected_url = response.headers["Location"] | |
| quer = parse_qs(urlparse(redirected_url).query) | |
| if "response-content-disposition" in quer: | |
| disp_val = quer["response-content-disposition"][0].split(";") | |
| for vals in disp_val: | |
| if vals.strip().startswith("filename="): | |
| filenm = unquote(vals.split("=", 1)[1].strip()) | |
| return filenm.replace('"', "") | |
| else: | |
| headers = { | |
| "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36" | |
| } | |
| lnk = "https://drive.google.com/uc?id={id}&export=download".format( | |
| id=url[url.find("/d/") + 3 : url.find("/view")] | |
| ) | |
| res = requests.session().get(lnk, headers=headers, stream=True, verify=True) | |
| res = requests.session().get( | |
| get_url_from_gdrive_confirmation(res.text), | |
| headers=headers, | |
| stream=True, | |
| verify=True, | |
| ) | |
| content_disposition = six.moves.urllib_parse.unquote( | |
| res.headers["Content-Disposition"] | |
| ) | |
| filenm = ( | |
| re.search(r"filename\*=UTF-8''(.*)", content_disposition) | |
| .groups()[0] | |
| .replace(os.path.sep, "_") | |
| ) | |
| return filenm | |
| def done(): | |
| done = widgets.Button( | |
| description='Done!', | |
| disabled=True, | |
| button_style='success', | |
| tooltip='', | |
| icon='check' | |
| ) | |
| display(done) |