From a Bilibili comment (2026-10-13):
- Esc closes the top layer: a dialog or menu (the plugin's alert and confirm
now close on Esc, as OK / Cancel), else the Workflows / Combos workspace,
else the browser. One capture listener decides before the layers act, so a
dialog closing on the same Esc still counts as above. The shortcut and the
Extensions entry toggle the browser.
- A model's file card has Show in folder: POST /anomalous/open_model_folder
(api/model_folder.py) takes type, folder index, subfolder and file name,
never a path, and opens Explorer / Finder with the file selected; a POST,
so local_guard keeps it to this computer. The card moves out of
ui_detail.js into model_location.js.
- A gallery card's right-click menu (gallery_card_menu.js): Insert as a Load
Image node reads the output file in place ("name.png [output]"), and View
Parameters.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
43 lines
1.7 KiB
Python
43 lines
1.7 KiB
Python
"""Shows a model file in this computer's file manager: Explorer or Finder with the file
|
|
selected, the folder on Linux. The request names the model the way the browser lists it
|
|
(type, folder index, subfolder, file name), never a path, and local_guard lets only this
|
|
computer ask (it is a POST)."""
|
|
import os
|
|
import subprocess
|
|
import sys
|
|
|
|
from aiohttp import web
|
|
|
|
from .utils import require_filename, resolve_folder_subdir, resolve_within
|
|
|
|
|
|
def _reveal(path):
|
|
if sys.platform == "win32":
|
|
subprocess.Popen(f'explorer /select,"{path}"')
|
|
elif sys.platform == "darwin":
|
|
subprocess.Popen(["open", "-R", path])
|
|
else:
|
|
subprocess.Popen(["xdg-open", os.path.dirname(path)])
|
|
|
|
|
|
async def api_open_model_folder(request):
|
|
try:
|
|
data = await request.json()
|
|
except ValueError:
|
|
data = None
|
|
if not isinstance(data, dict):
|
|
return web.json_response({"status": "error", "message": "Invalid request body"}, status=400)
|
|
try:
|
|
filename = require_filename(data.get("filename", ""))
|
|
_, folder = resolve_folder_subdir(data.get("type", ""), int(data.get("path_idx", 0)), data.get("subfolder", "/"))
|
|
path = resolve_within(folder, filename)
|
|
except (ValueError, KeyError, TypeError):
|
|
return web.json_response({"status": "error", "message": "Invalid request parameters"}, status=400)
|
|
if not os.path.isfile(path):
|
|
return web.json_response({"status": "error", "message": "Model file not found"}, status=404)
|
|
try:
|
|
_reveal(path)
|
|
except OSError as error:
|
|
return web.json_response({"status": "error", "message": str(error)}, status=500)
|
|
return web.json_response({"status": "success"})
|