Files
niknah-presentation-ComfyUI/WebClient.py
T
2025-10-12 17:21:15 +11:00

176 lines
5.7 KiB
Python

import os
import folder_paths
import shutil
from aiohttp import web
# import fnmatch
import logging
import pathlib
import traceback
import re
from server import PromptServer
logger = logging.getLogger(__name__)
class WebClient:
def scan_paths(self, files_info, path, regex, subfolder):
with os.scandir(path) as it:
for entry in it:
entry_name = entry.name
if subfolder is not None:
entry_name = os.path.join(
subfolder, entry.name
)
if not entry.name.startswith(".") and entry.is_dir():
self.scan_paths(
files_info,
os.path.join(path, entry.name),
regex,
entry_name,
)
elif (
regex.search(entry.name)
and entry.is_file()
):
st = entry.stat()
files_info.append({
'file': entry_name,
'mtime': st.st_mtime,
'size': st.st_size,
})
async def web_files(self, request):
try:
js = request.query
regex = re.compile(js['regex'], re.IGNORECASE)
path_type = 'output'
if 'path' in js:
path_type = js['path']
files_info = []
use_email = 'email' in js
main_path = folder_paths.get_directory_by_type(path_type)
if main_path is None:
use_email = False
paths = folder_paths.get_folder_paths(path_type)
else:
paths = [main_path]
subfolder = None
for path in paths:
if 'subfolder' in js:
subfolder = js['subfolder']
path = os.path.join(path, subfolder)
if use_email:
path = os.path.join(
path,
js['email']
)
if os.path.exists(path):
self.scan_paths(files_info, path, regex, "")
files_info.sort(key=lambda x: x['file'])
return web.json_response({
"ok": True,
'files': files_info,
})
except Exception as e:
logger.error(f"files Error {e}")
traceback.print_exc()
return web.json_response({
"ok": False,
})
def move_output(self, dest_folder, dest_subfolder, output):
if (
'filename' in output
and 'type' in output
and 'subfolder' in output
):
filename = output['filename']
subfolder = output['subfolder']
dest_folder = os.path.join(dest_folder, subfolder)
if not os.path.exists(dest_folder):
os.makedirs(dest_folder)
dest_file = os.path.join(
dest_folder,
filename,
)
src_file = os.path.join(
folder_paths.get_directory_by_type(output['type']),
subfolder,
filename,
)
ok = True
if os.path.exists(src_file) and os.path.getsize(src_file) > 0:
try:
shutil.move(src_file, dest_file)
pathlib.Path(src_file).touch()
except Exception as e:
ok = False
logger.error((
f"Move files error: {src_file} -> "
f"{dest_file} error:{e}"
))
traceback.print_exc()
return ok
return False
async def web_history_move(self, request):
try:
q = request.query
prompt_id = request.match_info.get('prompt_id')
history = PromptServer.instance.prompt_queue.get_history(
prompt_id=prompt_id)
moved = 0
if 'subfolder' in q:
dest_subfolder = q['subfolder']
dest_folder = os.path.join(
folder_paths.get_directory_by_type('output'),
dest_subfolder,
)
if prompt_id in history:
prompt = history[prompt_id]['outputs']
for node_id, node in prompt.items():
for output_type, output_list in node.items():
if output_type == 'animated':
continue
if type(output_list) is bool:
logger.error(f"Output is boolean: {node}")
continue
for output_item in output_list:
if (self.move_output(
dest_folder,
dest_subfolder,
output_item
)):
output_item['type'] = 'output'
moved += 1
else:
logger.error((
f"history_move: Cannot find prompt_id: {prompt_id}"
))
return web.json_response({
"ok": True,
"history": history,
"moved": moved
})
except Exception as e:
logger.error(f"files Error {e}")
traceback.print_exc()
return web.json_response({
"ok": False,
})