File size: 5,603 Bytes
ae19ca0 2f5a504 ae19ca0 2f5a504 ae19ca0 2f5a504 ae19ca0 2f5a504 ae19ca0 2f5a504 ae19ca0 2f5a504 ae19ca0 2f5a504 ae19ca0 b244e4c 2f5a504 ae19ca0 b244e4c ae19ca0 f975b6f | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 | import os
import sys
import re
import json
import argparse
from pathlib import Path
import subprocess
import shlex
from IPython import get_ipython
# --- Configuration ---
# You can change this to any name you want for your main folder.
WEBUI_FOLDER_NAME = 'stable-diffusion-webui-reForge'
# --- Constants for Environment Detection ---
ENV = {
'Colab': ('/content', '/content', 'COLAB_JUPYTER_TOKEN'),
'Kaggle': ('/kaggle', '/kaggle/working', 'KAGGLE_DATA_PROXY_TOKEN')
}
# --- Color Codes for Readable Output ---
RESET = '\033[0m'
RED = '\033[31m'
GREEN = '\033[32m'
YELLOW = '\033[33m'
ARROW = f'{YELLOW}▶{RESET}'
ERROR = f'{RED}[ERROR]{RESET}'
SUCCESS = f'{GREEN}[SUCCESS]{RESET}'
INFO = f'{YELLOW}[INFO]{RESET}'
# --- 1. Environment Detection ---
def get_environment():
"""Detects if the script is running on Colab or Kaggle and returns paths."""
for name, (base, home, var) in ENV.items():
if var in os.environ:
print(f"{INFO} Detected environment: {name}")
return name, Path(base), Path(home)
print(f"{ERROR} This script must be run on Google Colab or Kaggle.")
sys.exit(1)
# --- 2. Argument Parsing for API Keys ---
def get_args():
"""Parses command-line arguments for API keys."""
parser = argparse.ArgumentParser(description='Setup API keys and directory shortcuts for model downloads.')
parser.add_argument('--civitai_key', required=True, help='Your CivitAI API key.')
parser.add_argument('--hf_read_token', default=None, help='Your Huggingface READ token (optional).')
args = parser.parse_args()
civitai_key = args.civitai_key.strip()
hf_read_token = args.hf_read_token.strip() if args.hf_read_token else ''
if not civitai_key:
print(f"{ERROR} Civitai API key is missing.")
sys.exit(1)
if re.search(r'\s+', civitai_key):
print(f"{ERROR} Civitai API key cannot contain spaces.")
sys.exit(1)
if len(civitai_key) < 32:
print(f"{ERROR} Civitai API key seems too short (must be at least 32 characters).")
sys.exit(1)
print(f"{SUCCESS} Civitai API key validated.")
if hf_read_token:
print(f"{SUCCESS} Huggingface token provided.")
return civitai_key, hf_read_token
# --- 3. API Key Injection ---
def download_helper_script(script_path):
"""Downloads the helper script (nenen88.py) if it doesn't exist."""
if not script_path.exists():
print(f"{ARROW} Downloading helper script to {script_path}...")
script_url = 'https://github.com/gutris1/segsmaker/raw/main/script/nenen88.py'
try:
subprocess.run(['wget', '-qO', str(script_path), script_url], check=True)
print(f"{SUCCESS} Helper script downloaded.")
except subprocess.CalledProcessError:
print(f"{ERROR} Failed to download helper script. API key injection will not work.")
sys.exit(1)
def inject_keys(civitai_key, hf_read_token, script_path):
"""Injects API keys into the downloaded helper script."""
print(f"{ARROW} Injecting API keys into helper script...")
try:
content = script_path.read_text()
content = content.replace("TOKET = ''", f"TOKET = '{civitai_key}'")
content = content.replace("TOBRUT = ''", f"TOBRUT = '{hf_read_token}'")
script_path.write_text(content)
print(f"{SUCCESS} API keys injected successfully.")
except FileNotFoundError:
print(f"{ERROR} Helper script not found at {script_path}. Cannot inject keys.")
sys.exit(1)
# --- 4. Directory Structure Creation (No Shortcuts) ---
def setup_directory_structure(webui_path, model_path):
"""
Creates a standard ReForge/A1111 directory structure.
(Shortcuts are not created, only the directories themselves).
"""
print(f"{ARROW} Setting up ReForge-style directory structure in {webui_path}...")
model_dirs = {
'Stable-diffusion',
'VAE',
'Lora',
'LyCORIS',
'embeddings',
'ControlNet',
'adetailer'
}
webui_path.mkdir(parents=True, exist_ok=True)
model_path.mkdir(parents=True, exist_ok=True)
for subdir in model_dirs:
(model_path / subdir).mkdir(parents=True, exist_ok=True)
print(f" - Created directory: {model_path / subdir}")
print(f"{SUCCESS} Directory structure is ready in {webui_path}")
# --- Main Execution ---
def main():
"""Main function to orchestrate the setup process."""
env_name, base_path, home_path = get_environment()
webui_path = base_path / WEBUI_FOLDER_NAME
model_path = webui_path / 'models'
startup_dir = Path('/root/.ipython/profile_default/startup')
startup_dir.mkdir(parents=True, exist_ok=True)
helper_script_path = startup_dir / 'nenen88.py'
civitai_key, hf_read_token = get_args()
download_helper_script(helper_script_path)
inject_keys(civitai_key, hf_read_token, helper_script_path)
# --- THE FIX: Execute the helper script to load its magic commands ---
print(f"{ARROW} Loading downloader functions...")
get_ipython().run_line_magic('run', str(helper_script_path))
print(f"{SUCCESS} Downloader is now ready!")
setup_directory_structure(webui_path, model_path)
print("\n" + "="*50)
print(f"{SUCCESS} Setup complete!")
print(f"{INFO} Your main folder is: {webui_path}")
print(f"{INFO} You can now use the %download magic command directly in your cells.")
print(f"{INFO} Models will be saved in the 'models' subdirectory of your main folder.")
print("="*50)
if __name__ == '__main__':
main() |