Spaces:
Configuration error
Configuration error
import os | |
import json | |
import platform | |
import sys | |
import numpy as np | |
import builtins | |
import torch | |
import shutil | |
import hashlib | |
import atexit | |
import server | |
import gc | |
import execution | |
import folder_paths | |
from functools import lru_cache | |
from aiohttp import web | |
from pathlib import Path | |
from PIL import Image | |
from PIL.PngImagePlugin import PngInfo | |
VERSION = "0.0.1" | |
ADDON_NAME = "AIGODLIKE-COMFYUI-TRANSLATION" | |
COMFY_PATH = Path(folder_paths.__file__).parent | |
CUR_PATH = Path(__file__).parent | |
def try_get_json(path: Path): | |
for coding in ["utf-8", "gbk"]: | |
try: | |
return json.loads(path.read_text(encoding=coding)) | |
except Exception: | |
continue | |
return {} | |
def get_nodes_translation(locale): | |
path = CUR_PATH.joinpath(locale, "Nodes") | |
if not path.exists(): | |
path = CUR_PATH.joinpath("en_US") | |
if not path.exists(): | |
return {} | |
translations = {} | |
for jpath in path.glob("*.json"): | |
translations.update(try_get_json(jpath)) | |
return translations | |
def get_category_translation(locale): | |
path = CUR_PATH.joinpath(locale, "NodeCategory.json") | |
if not path.exists(): | |
path = CUR_PATH.joinpath("en_US", "NodeCategory.json") | |
if not path.exists(): | |
return {} | |
return try_get_json(path) | |
def get_menu_translation(locale): | |
path = CUR_PATH.joinpath(locale, "Menu.json") | |
if not path.exists(): | |
path = CUR_PATH.joinpath("en_US", "Menu.json") | |
if not path.exists(): | |
return {} | |
return try_get_json(path) | |
def compile_translation(locale): | |
# translations_path = CUR_PATH.joinpath(f"translations_{locale}.json") | |
# if translations_path.exists(): | |
# return try_get_json(translations_path) | |
# Nodes | |
nodes_translation = get_nodes_translation(locale) | |
# NodeCategory | |
node_category_translation = get_category_translation(locale) | |
# Menus | |
menu_translation = get_menu_translation(locale) | |
# compile | |
json_data = json.dumps(obj={"Nodes": nodes_translation, | |
"NodeCategory": node_category_translation, | |
"Menu": menu_translation | |
}, | |
ensure_ascii=False) | |
# translations_path.write_text(json_data, encoding="utf-8") | |
return json_data | |
def compress_json(data, method="gzip"): | |
if method == "gzip": | |
import gzip | |
return gzip.compress(data.encode("utf-8")) | |
else: | |
return data | |
async def get_translation(request: web.Request): | |
post = await request.post() | |
locale = post.get("locale", "en_US") | |
accept_encoding = request.headers.get("Accept-Encoding", "") | |
json_data = "{}" | |
headers = {} | |
try: | |
json_data = compile_translation(locale) | |
if "gzip" in accept_encoding: | |
json_data = compress_json(json_data, method="gzip") | |
headers["Content-Encoding"] = "gzip" | |
# 指定 charset 为 utf-8 | |
# headers["Content-Type"] = "application/json; charset=utf-8" | |
except Exception as e: | |
sys.stderr.write(f"[agl/get_translation error]: {e}\n") | |
sys.stderr.flush() | |
return web.Response(status=200, body=json_data, headers=headers) | |
def rmtree(path: Path): | |
# unlink symbolic link | |
if not path.exists(): | |
return | |
if Path(path.resolve()).as_posix() != path.as_posix(): | |
path.unlink() | |
return | |
if path.is_file(): | |
path.unlink() | |
elif path.is_dir(): | |
# 移除 .git | |
if path.name == ".git": | |
if platform.system() == "darwin": | |
from subprocess import call | |
call(['rm', '-rf', path.as_posix()]) | |
elif platform.system() == "Windows": | |
os.system(f'rd/s/q "{path.as_posix()}"') | |
return | |
for child in path.iterdir(): | |
rmtree(child) | |
try: | |
path.rmdir() # nas 的共享盘可能会有残留 | |
except BaseException: | |
... | |
def register(): | |
import nodes | |
aigodlike_ext_path = COMFY_PATH.joinpath("web", "extensions", ADDON_NAME) | |
if hasattr(nodes, "EXTENSION_WEB_DIRS"): | |
rmtree(aigodlike_ext_path) | |
return | |
# 新版已经不需要复制文件了 | |
try: | |
if os.name == "nt": | |
try: | |
import _winapi | |
_winapi.CreateJunction(CUR_PATH.as_posix(), aigodlike_ext_path.as_posix()) | |
except WindowsError as e: | |
shutil.copytree(CUR_PATH.as_posix(), aigodlike_ext_path.as_posix(), ignore=shutil.ignore_patterns(".git")) | |
else: | |
# 复制时过滤 .git | |
shutil.copytree(CUR_PATH.as_posix(), aigodlike_ext_path.as_posix(), ignore=shutil.ignore_patterns(".git")) | |
except Exception as e: | |
sys.stderr.write(f"[agl/register error]: {e}\n") | |
sys.stderr.flush() | |
def unregister(): | |
# 移除缓存json | |
# for data in CUR_PATH.glob("*.json"): | |
# if not data.name.startswith("translations_"): | |
# continue | |
# data.unlink() | |
aigodlike_ext_path = COMFY_PATH.joinpath("web", "extensions", ADDON_NAME) | |
try: | |
rmtree(aigodlike_ext_path) | |
except BaseException: | |
... | |
register() | |
atexit.register(unregister) | |
NODE_CLASS_MAPPINGS = {} | |
WEB_DIRECTORY = "./" | |