Browse Source

init commit

jtydhr88 1 year ago
commit
575902fd06

+ 8 - 0
.idea/.gitignore

@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml

+ 24 - 0
.idea/inspectionProfiles/Project_Default.xml

@@ -0,0 +1,24 @@
+<component name="InspectionProjectProfileManager">
+  <profile version="1.0">
+    <option name="myName" value="Project Default" />
+    <inspection_tool class="CssUnknownProperty" enabled="true" level="WARNING" enabled_by_default="true">
+      <option name="myCustomPropertiesEnabled" value="true" />
+      <option name="myIgnoreVendorSpecificProperties" value="false" />
+      <option name="myCustomPropertiesList">
+        <value>
+          <list size="1">
+            <item index="0" class="java.lang.String" itemvalue="transform" />
+          </list>
+        </value>
+      </option>
+    </inspection_tool>
+    <inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="PyUnresolvedReferencesInspection" enabled="true" level="WARNING" enabled_by_default="true">
+      <option name="ignoredIdentifiers">
+        <list>
+          <option value="pathlib.Path.__add__" />
+        </list>
+      </option>
+    </inspection_tool>
+  </profile>
+</component>

+ 6 - 0
.idea/inspectionProfiles/profiles_settings.xml

@@ -0,0 +1,6 @@
+<component name="InspectionProjectProfileManager">
+  <settings>
+    <option name="USE_PROJECT_PROFILE" value="false" />
+    <version value="1.0" />
+  </settings>
+</component>

+ 4 - 0
.idea/misc.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.10 (segment-anything)" project-jdk-type="Python SDK" />
+</project>

+ 8 - 0
.idea/modules.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/.idea/sd-webui-StableStudio.iml" filepath="$PROJECT_DIR$/.idea/sd-webui-StableStudio.iml" />
+    </modules>
+  </component>
+</project>

+ 8 - 0
.idea/sd-webui-StableStudio.iml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="PYTHON_MODULE" version="4">
+  <component name="NewModuleRootManager">
+    <content url="file://$MODULE_DIR$" />
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>

+ 6 - 0
.idea/vcs.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="" vcs="Git" />
+  </component>
+</project>

+ 22 - 0
README.md

@@ -0,0 +1,22 @@
+# Stable Diffusion WebUI StableStudio Adapter
+A custom extension for [AUTOMATIC1111/stable-diffusion-webui](https://github.com/AUTOMATIC1111/stable-diffusion-webui) to extend rest APIs to do some local operations, using in StableStudio.
+
+## Installation
+Just like you install other extension of webui:
+1. go to Extensions -> Install from URL
+2. paste this repo link
+3. install
+4. go to Installed, stop, and restart webui with api mode
+
+## APIs use for StableStudio
+Since StableStudio needs to make some local operations but webui doesn't provide by default for now, so we need this extension. 
+Currently, there are two apis exposed:
+![api-list](doc/images/api-list.png)
+
+1. **/StableStudio/check-extension-installed**  
+Not use yet but it will be a good start to check some extensions installed on user webui, for example, ControlNet or Openpose 
+2. **/StableStudio/get-generated-images**  
+Using for load existing images from user end.
+
+## Credits
+Created by [jtydhr88](https://github.com/jtydhr88).

BIN
doc/images/api-list.png


+ 85 - 0
scripts/api.py

@@ -0,0 +1,85 @@
+import numpy as np
+from fastapi import FastAPI, Body
+from fastapi.exceptions import HTTPException
+from PIL import Image
+import os
+import gradio as gr
+
+from modules.api.models import *
+from modules.api import api
+import glob
+import base64
+from pydantic import BaseModel
+
+
+def get_root_path():
+    path = os.path.dirname(os.path.realpath(__file__))
+    path = os.path.dirname(path)
+    path = os.path.dirname(path)
+    path = os.path.dirname(path)
+
+    return path
+
+
+class GetGeneratedImagesRequest(BaseModel):
+    limit: int = 10
+
+
+def StableStudio_api(_: gr.Blocks, app: FastAPI):
+    @app.get("/StableStudio/check-extension-installed")
+    async def check_extension_installed(extension_name: str):
+        extension_path = os.path.join(get_root_path(), "extensions", extension_name)
+
+        installed = 0
+
+        if os.path.exists(extension_path):
+            installed = 1
+
+        return {
+            "extension_path": extension_path,
+            "installed": installed
+        }
+
+    @app.post("/StableStudio/get-generated-images")
+    async def get_generated_images(request: GetGeneratedImagesRequest):
+        outputs_path = os.path.join(get_root_path(), "outputs")
+
+        txt2img_folder = os.path.join(outputs_path, 'txt2img-images', '**')
+        img2img_folder = os.path.join(outputs_path, 'img2img-images', '**')
+
+        files = glob.glob(txt2img_folder, recursive=True) + glob.glob(img2img_folder, recursive=True)
+
+        files = [f for f in files if os.path.isfile(f)]
+
+        files.sort(key=os.path.getctime, reverse=True)
+
+        files = files[:request.limit]
+
+        return_values = []
+
+        for file in files:
+            with open(file, "rb") as f:
+                img = Image.open(f)
+                width, height = img.size
+
+                encoded_content = api.encode_pil_to_base64(img)
+
+                return_value = {
+                    "image_name": os.path.basename(file),
+                    "create_date": os.path.getctime(file),
+                    "content": encoded_content,
+                    "width": width,
+                    "height": height
+                }
+
+                return_values.append(return_value)
+
+        return return_values
+
+
+try:
+    import modules.script_callbacks as script_callbacks
+
+    script_callbacks.on_app_started(StableStudio_api)
+except:
+    pass