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()