Commit 6398dc9b authored by AUTOMATIC's avatar AUTOMATIC

further support for extensions

parent 2b912516
...@@ -28,3 +28,4 @@ notification.mp3 ...@@ -28,3 +28,4 @@ notification.mp3
/SwinIR /SwinIR
/textual_inversion /textual_inversion
.vscode .vscode
/extensions
...@@ -83,8 +83,7 @@ Check the [custom scripts](https://github.com/AUTOMATIC1111/stable-diffusion-web ...@@ -83,8 +83,7 @@ Check the [custom scripts](https://github.com/AUTOMATIC1111/stable-diffusion-web
- Estimated completion time in progress bar - Estimated completion time in progress bar
- API - API
- Support for dedicated [inpainting model](https://github.com/runwayml/stable-diffusion#inpainting-with-stable-diffusion) by RunwayML. - Support for dedicated [inpainting model](https://github.com/runwayml/stable-diffusion#inpainting-with-stable-diffusion) by RunwayML.
- Aesthetic Gradients, a way to generate images with a specific aesthetic by using clip images embds (implementation of [https://github.com/vicgalle/stable-diffusion-aesthetic-gradients](https://github.com/vicgalle/stable-diffusion-aesthetic-gradients)) - via extension: [Aesthetic Gradients](https://github.com/AUTOMATIC1111/stable-diffusion-webui-aesthetic-gradients), a way to generate images with a specific aesthetic by using clip images embds (implementation of [https://github.com/vicgalle/stable-diffusion-aesthetic-gradients](https://github.com/vicgalle/stable-diffusion-aesthetic-gradients))
## Installation and Running ## Installation and Running
Make sure the required [dependencies](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Dependencies) are met and follow the instructions available for both [NVidia](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Install-and-Run-on-NVidia-GPUs) (recommended) and [AMD](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Install-and-Run-on-AMD-GPUs) GPUs. Make sure the required [dependencies](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Dependencies) are met and follow the instructions available for both [NVidia](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Install-and-Run-on-NVidia-GPUs) (recommended) and [AMD](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Install-and-Run-on-AMD-GPUs) GPUs.
......
...@@ -102,17 +102,39 @@ def list_scripts(scriptdirname, extension): ...@@ -102,17 +102,39 @@ def list_scripts(scriptdirname, extension):
if os.path.exists(extdir): if os.path.exists(extdir):
for dirname in sorted(os.listdir(extdir)): for dirname in sorted(os.listdir(extdir)):
dirpath = os.path.join(extdir, dirname) dirpath = os.path.join(extdir, dirname)
if not os.path.isdir(dirpath): scriptdirpath = os.path.join(dirpath, scriptdirname)
if not os.path.isdir(scriptdirpath):
continue continue
for filename in sorted(os.listdir(os.path.join(dirpath, scriptdirname))): for filename in sorted(os.listdir(scriptdirpath)):
scripts_list.append(ScriptFile(dirpath, filename, os.path.join(dirpath, scriptdirname, filename))) scripts_list.append(ScriptFile(dirpath, filename, os.path.join(scriptdirpath, filename)))
scripts_list = [x for x in scripts_list if os.path.splitext(x.path)[1].lower() == extension and os.path.isfile(x.path)] scripts_list = [x for x in scripts_list if os.path.splitext(x.path)[1].lower() == extension and os.path.isfile(x.path)]
return scripts_list return scripts_list
def list_files_with_name(filename):
res = []
dirs = [paths.script_path]
extdir = os.path.join(paths.script_path, "extensions")
if os.path.exists(extdir):
dirs += [os.path.join(extdir, d) for d in sorted(os.listdir(extdir))]
for dirpath in dirs:
if not os.path.isdir(dirpath):
continue
path = os.path.join(dirpath, filename)
if os.path.isfile(filename):
res.append(path)
return res
def load_scripts(): def load_scripts():
global current_basedir global current_basedir
scripts_data.clear() scripts_data.clear()
...@@ -276,7 +298,7 @@ class ScriptRunner: ...@@ -276,7 +298,7 @@ class ScriptRunner:
print(f"Error running alwayson script: {script.filename}", file=sys.stderr) print(f"Error running alwayson script: {script.filename}", file=sys.stderr)
print(traceback.format_exc(), file=sys.stderr) print(traceback.format_exc(), file=sys.stderr)
def reload_sources(self): def reload_sources(self, cache):
for si, script in list(enumerate(self.scripts)): for si, script in list(enumerate(self.scripts)):
with open(script.filename, "r", encoding="utf8") as file: with open(script.filename, "r", encoding="utf8") as file:
args_from = script.args_from args_from = script.args_from
...@@ -286,9 +308,12 @@ class ScriptRunner: ...@@ -286,9 +308,12 @@ class ScriptRunner:
from types import ModuleType from types import ModuleType
compiled = compile(text, filename, 'exec') module = cache.get(filename, None)
module = ModuleType(script.filename) if module is None:
exec(compiled, module.__dict__) compiled = compile(text, filename, 'exec')
module = ModuleType(script.filename)
exec(compiled, module.__dict__)
cache[filename] = module
for key, script_class in module.__dict__.items(): for key, script_class in module.__dict__.items():
if type(script_class) == type and issubclass(script_class, Script): if type(script_class) == type and issubclass(script_class, Script):
...@@ -303,8 +328,9 @@ scripts_img2img = ScriptRunner() ...@@ -303,8 +328,9 @@ scripts_img2img = ScriptRunner()
def reload_script_body_only(): def reload_script_body_only():
scripts_txt2img.reload_sources() cache = {}
scripts_img2img.reload_sources() scripts_txt2img.reload_sources(cache)
scripts_img2img.reload_sources(cache)
def reload_scripts(): def reload_scripts():
......
...@@ -1636,13 +1636,15 @@ Requested path was: {f} ...@@ -1636,13 +1636,15 @@ Requested path was: {f}
interfaces += [(settings_interface, "Settings", "settings")] interfaces += [(settings_interface, "Settings", "settings")]
with open(os.path.join(script_path, "style.css"), "r", encoding="utf8") as file: css = ""
css = file.read()
for cssfile in modules.scripts.list_files_with_name("style.css"):
with open(cssfile, "r", encoding="utf8") as file:
css += file.read() + "\n"
if os.path.exists(os.path.join(script_path, "user.css")): if os.path.exists(os.path.join(script_path, "user.css")):
with open(os.path.join(script_path, "user.css"), "r", encoding="utf8") as file: with open(os.path.join(script_path, "user.css"), "r", encoding="utf8") as file:
usercss = file.read() css += file.read() + "\n"
css += usercss
if not cmd_opts.no_progressbar_hiding: if not cmd_opts.no_progressbar_hiding:
css += css_hide_progressbar css += css_hide_progressbar
...@@ -1865,9 +1867,9 @@ def load_javascript(raw_response): ...@@ -1865,9 +1867,9 @@ def load_javascript(raw_response):
with open(os.path.join(script_path, "script.js"), "r", encoding="utf8") as jsfile: with open(os.path.join(script_path, "script.js"), "r", encoding="utf8") as jsfile:
javascript = f'<script>{jsfile.read()}</script>' javascript = f'<script>{jsfile.read()}</script>'
jsdir = os.path.join(script_path, "javascript") scripts_list = modules.scripts.list_scripts("javascript", ".js")
for filename in sorted(os.listdir(jsdir)): for basedir, filename, path in scripts_list:
with open(os.path.join(jsdir, filename), "r", encoding="utf8") as jsfile: with open(path, "r", encoding="utf8") as jsfile:
javascript += f"\n<!-- {filename} --><script>{jsfile.read()}</script>" javascript += f"\n<!-- {filename} --><script>{jsfile.read()}</script>"
if cmd_opts.theme is not None: if cmd_opts.theme is not None:
...@@ -1885,6 +1887,5 @@ def load_javascript(raw_response): ...@@ -1885,6 +1887,5 @@ def load_javascript(raw_response):
gradio.routes.templates.TemplateResponse = template_response gradio.routes.templates.TemplateResponse = template_response
reload_javascript = partial(load_javascript, reload_javascript = partial(load_javascript, gradio.routes.templates.TemplateResponse)
gradio.routes.templates.TemplateResponse)
reload_javascript() reload_javascript()
...@@ -477,7 +477,7 @@ input[type="range"]{ ...@@ -477,7 +477,7 @@ input[type="range"]{
padding: 0; padding: 0;
} }
#refresh_sd_model_checkpoint, #refresh_sd_hypernetwork, #refresh_train_hypernetwork_name, #refresh_train_embedding_name, #refresh_localization, #refresh_aesthetic_embeddings{ #refresh_sd_model_checkpoint, #refresh_sd_hypernetwork, #refresh_train_hypernetwork_name, #refresh_train_embedding_name, #refresh_localization{
max-width: 2.5em; max-width: 2.5em;
min-width: 2.5em; min-width: 2.5em;
height: 2.4em; height: 2.4em;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment