aboutsummaryrefslogtreecommitdiffstats
path: root/modules/scripts.py
diff options
context:
space:
mode:
Diffstat (limited to 'modules/scripts.py')
-rw-r--r--modules/scripts.py53
1 files changed, 53 insertions, 0 deletions
diff --git a/modules/scripts.py b/modules/scripts.py
new file mode 100644
index 00000000..20f489ce
--- /dev/null
+++ b/modules/scripts.py
@@ -0,0 +1,53 @@
+import os
+import sys
+import traceback
+
+import gradio as gr
+
+class Script:
+ filename = None
+
+ def title(self):
+ raise NotImplementedError()
+
+
+scripts = []
+
+
+def load_scripts(basedir, globs):
+ for filename in os.listdir(basedir):
+ path = os.path.join(basedir, filename)
+
+ if not os.path.isfile(path):
+ continue
+
+ with open(path, "r", encoding="utf8") as file:
+ text = file.read()
+
+ from types import ModuleType
+ compiled = compile(text, path, 'exec')
+ module = ModuleType(filename)
+ module.__dict__.update(globs)
+ exec(compiled, module.__dict__)
+
+ for key, item in module.__dict__.items():
+ if type(item) == type and issubclass(item, Script):
+ item.filename = path
+
+ scripts.append(item)
+
+
+def wrap_call(func, filename, funcname, *args, default=None, **kwargs):
+ try:
+ res = func()
+ return res
+ except Exception:
+ print(f"Error calling: {filename/funcname}", file=sys.stderr)
+ print(traceback.format_exc(), file=sys.stderr)
+
+ return default
+
+def setup_ui():
+ titles = [wrap_call(script.title, script.filename, "title") for script in scripts]
+
+ gr.Dropdown(options=[""] + titles, value="", type="index")