| | import os |
| | import sys |
| | import re |
| | import json |
| | import argparse |
| | from pathlib import Path |
| | import subprocess |
| | import shlex |
| | from IPython import get_ipython |
| |
|
| | |
| | |
| | WEBUI_FOLDER_NAME = 'stable-diffusion-webui-reForge' |
| |
|
| | |
| | ENV = { |
| | 'Colab': ('/content', '/content', 'COLAB_JUPYTER_TOKEN'), |
| | 'Kaggle': ('/kaggle', '/kaggle/working', 'KAGGLE_DATA_PROXY_TOKEN') |
| | } |
| |
|
| | |
| | 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}' |
| |
|
| | |
| | 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) |
| |
|
| | |
| | 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 |
| |
|
| | |
| | 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) |
| |
|
| | |
| | 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}") |
| |
|
| | |
| | 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) |
| |
|
| | |
| | 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() |