Browse Source

feat: custom node install api

pull/258/head
Dr.Lt.Data 11 months ago
parent
commit
60386b569e
  1. 45
      __init__.py
  2. 54
      js/cm-api.js
  3. 2
      js/comfyui-share-common.js
  4. 4
      js/common.js
  5. 3
      prestartup_script.py

45
__init__.py

@ -20,7 +20,7 @@ import nodes
import torch
version = [1, 15, 1]
version = [1, 16]
version_str = f"V{version[0]}.{version[1]}" + (f'.{version[2]}' if len(version) > 2 else '')
print(f"### Loading: ComfyUI-Manager ({version_str})")
@ -1968,6 +1968,49 @@ async def share_art(request):
}, content_type='application/json', status=200)
def register_api(k, f):
sys.CM_api[k] = f
def sanitize(data):
return data.replace("<", "&lt;").replace(">", "&gt;")
def lookup_customnode_by_url(data, target):
for x in data['custom_nodes']:
if target in x['files']:
dir_name = os.path.splitext(os.path.basename(target))[0].replace(".git", "")
dir_path = os.path.join(custom_nodes_path, dir_name)
if os.path.exists(dir_path):
x['installed'] = 'True'
elif os.path.exists(dir_path + ".disabled"):
x['installed'] = 'Disabled'
return x
return None
async def _confirm_try_install(sender, custom_node_url, msg):
json_obj = await get_data_by_mode('default', 'custom-node-list.json')
sender = sanitize(sender)
msg = sanitize(msg)
target = lookup_customnode_by_url(json_obj, custom_node_url)
if target is not None:
server.PromptServer.instance.send_sync("cm-api-try-install-customnode",
{"sender": sender, "target": target, "msg": msg})
else:
print(f"[ComfyUI Manager API] Failed to try install - Unknown custom node url '{custom_node_url}'")
def confirm_try_install(sender, custom_node_url, msg):
asyncio.run(_confirm_try_install(sender, custom_node_url, msg))
register_api('cm.try-install-custom-node', confirm_try_install)
import asyncio
async def default_cache_update():
async def get_cache(filename):

54
js/cm-api.js

@ -0,0 +1,54 @@
import { api } from "../../scripts/api.js";
import { app } from "../../scripts/app.js";
import { sleep } from "./common.js";
async function tryInstallCustomNode(event) {
let msg = '-= [ComfyUI Manager] extension installation request =-\n\n';
msg += `The '${event.detail.sender}' extension requires the installation of the '${event.detail.title}' extension. `;
if(event.detail.target.installed == 'Disabled') {
msg += 'However, the extension is currently disabled. Would you like to enable it and reboot?'
}
else if(event.detail.target.installed == 'True') {
msg += 'However, it seems that the extension is in an import-fail state or is not compatible with the current version. Please address this issue.';
}
else {
msg += `Would you like to install it and reboot?`;
}
msg += `\n\nRequest message:\n${event.detail.msg}`;
if(event.detail.target.installed == 'True') {
alert(msg);
return;
}
let res = confirm(msg);
if(res) {
if(event.detail.target.installed == 'Disabled') {
const response = await api.fetchApi(`/customnode/toggle_active`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(event.detail.target)
});
}
else {
await sleep(300);
app.ui.dialog.show(`Installing... '${event.detail.target.title}'`);
const response = await api.fetchApi(`/customnode/install`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(event.detail.target)
});
}
api.fetchApi("/manager/reboot");
await sleep(300);
app.ui.dialog.show(`Rebooting...`);
}
}
api.addEventListener("cm-api-try-install-customnode", tryInstallCustomNode);

2
js/comfyui-share-common.js vendored

@ -1,5 +1,5 @@
import { app } from "../../scripts/app.js";
import { api } from "../../scripts/api.js"
import { api } from "../../scripts/api.js";
import { ComfyDialog, $el } from "../../scripts/ui.js";
import { OpenArtShareDialog } from "./comfyui-share-openart.js";

4
js/common.js

@ -1,6 +1,10 @@
import { app } from "../../scripts/app.js";
import { api } from "../../scripts/api.js"
export async function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
export function rebootAPI() {
if (confirm("Are you sure you'd like to reboot the server?")) {
try {

3
prestartup_script.py

@ -9,6 +9,9 @@ import locale
import platform
sys.CM_api = {}
message_collapses = []
import_failed_extensions = set()

Loading…
Cancel
Save