From 35a7dbff1da8606d4e592bd51d42a62683e0f09e Mon Sep 17 00:00:00 2001 From: AlekPet Date: Tue, 29 Apr 2025 17:42:43 +0300 Subject: [PATCH] initial auto install deeplx (go, and deeplx repository) --- DeepLXTranslateNode/deeplx_translate_node.py | 58 +++++- DeepLXTranslateNode/install_deeplx.py | 185 +++++++++++++++++++ pyproject.toml | 2 +- 3 files changed, 237 insertions(+), 8 deletions(-) create mode 100644 DeepLXTranslateNode/install_deeplx.py diff --git a/DeepLXTranslateNode/deeplx_translate_node.py b/DeepLXTranslateNode/deeplx_translate_node.py index d612fac..a0286e6 100644 --- a/DeepLXTranslateNode/deeplx_translate_node.py +++ b/DeepLXTranslateNode/deeplx_translate_node.py @@ -7,6 +7,7 @@ import json import subprocess import requests import time +from . import install_deeplx LANGUAGES_CODES = { @@ -148,18 +149,61 @@ RETRY_CHECK_SERVER = 10 PATH_TO_DEEPLX_SERVER = os.path.join(NODE_DIR, "DeepLX") PATH_TO_GO = os.path.join(NODE_DIR, "go", "bin") +### Automatical install Golang (Go) and DeepLX ### + +# Get platform +platform = install_deeplx.getPlatform() + # Checking exists path to Go +if platform is not None: + try: + # Install Golang (Go) + if not os.path.exists(PATH_TO_GO): + print( + f"{ColPrint.YELLOW}[DeepLXTranslateNode]{ColPrint.MAGNETA} Path to 'Golang (Go)' not exists, try install...{ColPrint.CLEAR}") + + # Get link + go_url = install_deeplx.GO_URLS[platform] + + # Download file + file_name, path_to_file = install_deeplx.download(go_url, NODE_DIR) + + # Extract file + install_deeplx.extractArchive(path_to_file) + + # Install DeepLX + if not os.path.exists(PATH_TO_DEEPLX_SERVER): + print( + f"{ColPrint.YELLOW}[DeepLXTranslateNode]{ColPrint.MAGNETA} Path to DeepLX server folder not exists, try install...{ColPrint.CLEAR}") + + # Get link + deeplx_url = install_deeplx.FILES_DOWNLOAD["DeepLX"] + + # Download file + file_name, path_to_file = install_deeplx.download(deeplx_url, NODE_DIR) + + # Extract file + install_deeplx.extractArchive(path_to_file) + + # Rename DeepLX-master to DeepLX + install_deeplx.otherOperations("DeepLX", NODE_DIR) + + except Exception as e: + raise e +else: + print(f"{ColPrint.RED}[DeepLXTranslateNode] Unable to determine identifying the underlying platform! Use manual installation!{ColPrint.CLEAR} ") + + +### end - Automatical install Golang (Go) and DeepLX ### + +# Checking pathes variables if not os.path.exists(PATH_TO_GO): - error_text = ( - f"{ColPrint.RED}Error path to 'Golang (Go)' not exists: {ColPrint.MAGNETA}{PATH_TO_GO}{ColPrint.CLEAR} " - ) - raise FileNotFoundError(error_text) + raise FileNotFoundError(f"Error path to 'Golang (Go)' not exists: {PATH_TO_GO}") -# Checking exists path to DeepLX folder if not os.path.exists(PATH_TO_DEEPLX_SERVER): - error_text = f"{ColPrint.RED}Error path to DeepLX server folder not exists: {ColPrint.MAGNETA}{PATH_TO_DEEPLX_SERVER}{ColPrint.CLEAR}" - raise FileNotFoundError(error_text) + raise FileNotFoundError(f"Error path to DeepLX server folder not exists: {PATH_TO_DEEPLX_SERVER}") + # Detect platform go_executable = os.path.join(PATH_TO_GO, "go") diff --git a/DeepLXTranslateNode/install_deeplx.py b/DeepLXTranslateNode/install_deeplx.py new file mode 100644 index 0000000..3f8fa8d --- /dev/null +++ b/DeepLXTranslateNode/install_deeplx.py @@ -0,0 +1,185 @@ +import os +from sys import version_info, platform as _platform +import platform +import requests +from tqdm import tqdm + +class ColPrintInstall: + RED = "\033[1;31;40m" + GREEN = "\033[92m" + YELLOW = "\033[93m" + MAGNETA = "\033[95m" + BLUE = "\033[94m" + CLEAR = "\033[0m" + + +GO_URLS = { + "win32": "https://go.dev/dl/go1.24.2.windows-386.zip", + "win64": "https://go.dev/dl/go1.24.2.windows-amd64.zip", + "darwin": "https://go.dev/dl/go1.24.2.darwin-arm64.tar.gz", + "linux": "https://go.dev/dl/go1.24.2.linux-386.tar.gz", + } + +FILES_DOWNLOAD = { + "Golang": None, + "DeepLX": "https://github.com/OwO-Network/DeepLX/archive/refs/heads/main.zip", +} + +WORK_DIR = os.path.dirname(os.path.abspath(__file__)) + + +def getPlatform(): + """ Get platform machine """ + platform_name = None + + if _platform.startswith("linux"): + platform_name = "linux" + + elif _platform == "darwin": + platform_name = "darwin" + + elif _platform == "win32": + # Check Windows id 64-bit + if platform.machine().endswith('64'): + platform_name = "win64" + else: + platform_name = "win32" + + print(f"{ColPrintInstall.YELLOW}[DeepLXTranslateNode]{ColPrintInstall.GREEN} Your platform is: {'macOS (Darwin)' if platform_name == 'darwin' else platform_name.capitalize()}{ColPrintInstall.CLEAR}") + + return platform_name + + +def download(url, save_to = WORK_DIR): + """ Download file """ + file_name = url.split('/')[-1] + print(f"{ColPrintInstall.YELLOW}[DeepLXTranslateNode]{ColPrintInstall.BLUE} Downloading file: {url}{ColPrintInstall.CLEAR}") + + response = requests.get(url, stream=True) + file_size = int(response.headers.get('Content-Length', 0)) + + save_file_path = os.path.join(save_to, file_name) + chunk_size = 1024 + + with open(save_file_path, "wb") as handle, tqdm( + desc=file_name, + total=file_size, + unit='B', + unit_scale=True, + unit_divisor=chunk_size, +) as progress_bar: + for data in response.iter_content(chunk_size=chunk_size): + handle.write(data) + progress_bar.update(len(data)) + + + print(f"{ColPrintInstall.YELLOW}[DeepLXTranslateNode]{ColPrintInstall.GREEN} File '{file_name}' downloaded!{ColPrintInstall.CLEAR}") + return file_name, save_file_path + + +def extractArchive(file_path, extract_to = WORK_DIR, removeArchive = True): + """ Extract zip or tar.gzip archive """ + try: + file_name = os.path.basename(file_path) + ext = os.path.splitext(file_path)[-1] + desc = f"Extracting '{file_name}'" + + # Type archive + if ext == ".gz": + # TarFile + import tarfile + + # Safe extract for python < 3.12 (secure path traversal) + def safe_extract(tar, path=".", members=None): + if members is None: + members = tar.getmembers() + + safe_members = [] + for member in members: + member_path = os.path.join(path, member.name) + if not os.path.abspath(member_path).startswith(os.path.abspath(path)): + continue + safe_members.append(member) + + tar.extractall(path, safe_members) + + # Open tar archive + with tarfile.open(file_path, 'r') as tar_archive: + members = tar_archive.getmembers() + + # Python >= 3.12 + if version_info >= (3, 12): + for file in tqdm(members, desc=desc, unit="file"): + tar_archive.extract(file, extract_to, filter='data') + else: + for member in tqdm(members, desc=desc): + safe_extract(tar_archive, extract_to, [member]) + + + elif ext == ".zip": + # ZipFile + import zipfile + + # Open zip archive + with zipfile.ZipFile(file_path, 'r') as zip_archive: + file_list = zip_archive.namelist() + + with tqdm(file_list, desc=desc, unit="file") as pbar: + for file in pbar: + zip_archive.extract(file, extract_to) + + print(f"{ColPrintInstall.YELLOW}[DeepLXTranslateNode]{ColPrintInstall.GREEN} Archive '{file_name}' extracted.{ColPrintInstall.CLEAR}") + + # Remove archive file + if removeArchive: + os.remove(file_path) + print(f"{ColPrintInstall.YELLOW}[DeepLXTranslateNode]{ColPrintInstall.MAGNETA} File {file_name} removed, after extract.{ColPrintInstall.CLEAR}\n") + + except Exception as e: + raise e + + +def otherOperations(name, save_path_dir): + if name == "DeepLX": + path_to_deeplx_master = os.path.join(save_path_dir, "DeepLX-main") + if os.path.isdir(path_to_deeplx_master): + os.rename(path_to_deeplx_master, os.path.join(save_path_dir, "DeepLX")) + print(f"{ColPrintInstall.YELLOW}[DeepLXTranslateNode]{ColPrintInstall.MAGNETA} Folder 'DeepLX-main' renamed to 'DeepLX'!{ColPrintInstall.CLEAR}") + + +def main(): + print("### Install Golang and DeepLX for ComfyUI DeepLXTranslateNode by AlekPet ###") + try: + platform_name = getPlatform() + if platform_name is None: + raise Exception("Unable to determine identifying the underlying platform!") + + url_down = GO_URLS[platform_name] + + # Download links (Golang and DeepLX) + FILES_DOWNLOAD["Golang"] = url_down + + for keyName in FILES_DOWNLOAD: + url = FILES_DOWNLOAD[keyName] + + if url is None: + continue + + # Download file + file_name, path_to_file = download(url, WORK_DIR) + + # Extract file + extractArchive(path_to_file) + + # Other operation + otherOperations(keyName, WORK_DIR) + + + print("--------------------\nComplete install Golang and DeepLX...") + + except Exception as e: + raise e + +if __name__ == "__main__": + main() + diff --git a/pyproject.toml b/pyproject.toml index 99481f4..49fbe28 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "comfyui_custom_nodes_alekpet" description = "Nodes: PoseNode, PainterNode, TranslateTextNode, TranslateCLIPTextEncodeNode, DeepTranslatorTextNode, DeepTranslatorCLIPTextEncodeNode, ArgosTranslateTextNode, ArgosTranslateCLIPTextEncodeNode, ChatGLM4TranslateCLIPTextEncodeNode, ChatGLM4TranslateTextNode, ChatGLM4InstructNode, ChatGLM4InstructMediaNode, DeepLXTranslateTextNode, DeepLXTranslateCLIPTextEncodeNode, PreviewTextNode, HexToHueNode, ColorsCorrectNode, IDENode." -version = "1.0.60" +version = "1.0.61" license = { file = "LICENSE" } [project.urls]