|
@@ -13,6 +13,7 @@
|
|
|
GET /assets/<game>/<path> 资源文件
|
|
GET /assets/<game>/<path> 资源文件
|
|
|
POST /api/generate 运行生成管线
|
|
POST /api/generate 运行生成管线
|
|
|
POST /api/export 把某 game 打包成 Cocos 整合包
|
|
POST /api/export 把某 game 打包成 Cocos 整合包
|
|
|
|
|
+ POST /api/open-folder 打开某 game 的本地素材目录
|
|
|
POST /api/delete 删除某 game 的资源库
|
|
POST /api/delete 删除某 game 的资源库
|
|
|
"""
|
|
"""
|
|
|
|
|
|
|
@@ -21,6 +22,8 @@ import mimetypes
|
|
|
import os
|
|
import os
|
|
|
import posixpath
|
|
import posixpath
|
|
|
import shutil
|
|
import shutil
|
|
|
|
|
+import subprocess
|
|
|
|
|
+import sys
|
|
|
import threading
|
|
import threading
|
|
|
import time
|
|
import time
|
|
|
import traceback
|
|
import traceback
|
|
@@ -397,6 +400,8 @@ class Handler(BaseHTTPRequestHandler):
|
|
|
route = urlparse(self.path).path
|
|
route = urlparse(self.path).path
|
|
|
if route == "/api/export":
|
|
if route == "/api/export":
|
|
|
return self._post_export()
|
|
return self._post_export()
|
|
|
|
|
+ if route == "/api/open-folder":
|
|
|
|
|
+ return self._post_open_folder()
|
|
|
if route == "/api/delete":
|
|
if route == "/api/delete":
|
|
|
return self._post_delete()
|
|
return self._post_delete()
|
|
|
if route == "/api/slot-workflow":
|
|
if route == "/api/slot-workflow":
|
|
@@ -481,6 +486,28 @@ class Handler(BaseHTTPRequestHandler):
|
|
|
return self._send(200, {"ok": True, "logs": logs, "game": game,
|
|
return self._send(200, {"ok": True, "logs": logs, "game": game,
|
|
|
"pack": os.path.abspath(pack)})
|
|
"pack": os.path.abspath(pack)})
|
|
|
|
|
|
|
|
|
|
+ def _post_open_folder(self):
|
|
|
|
|
+ try:
|
|
|
|
|
+ data = self._read_json_body()
|
|
|
|
|
+ except Exception as e:
|
|
|
|
|
+ return self._send(400, {"ok": False, "error": f"请求体不是合法 JSON: {e}"})
|
|
|
|
|
+ game = (data.get("game") or "").strip()
|
|
|
|
|
+ if not game or game not in list_games():
|
|
|
|
|
+ return self._send(400, {"ok": False, "error": f"无效的 game: {game!r}"})
|
|
|
|
|
+ target = os.path.abspath(os.path.join(OUT_ROOT, game))
|
|
|
|
|
+ if not target.startswith(os.path.abspath(OUT_ROOT) + os.sep) or not os.path.isdir(target):
|
|
|
|
|
+ return self._send(400, {"ok": False, "error": "素材目录不存在或路径非法"})
|
|
|
|
|
+ try:
|
|
|
|
|
+ if sys.platform == "darwin":
|
|
|
|
|
+ subprocess.Popen(["open", target])
|
|
|
|
|
+ elif os.name == "nt":
|
|
|
|
|
+ os.startfile(target) # type: ignore[attr-defined]
|
|
|
|
|
+ else:
|
|
|
|
|
+ subprocess.Popen(["xdg-open", target])
|
|
|
|
|
+ except Exception as e:
|
|
|
|
|
+ return self._send(500, {"ok": False, "error": f"打开素材目录失败: {e}"})
|
|
|
|
|
+ return self._send(200, {"ok": True, "game": game, "path": target})
|
|
|
|
|
+
|
|
|
def _post_delete(self):
|
|
def _post_delete(self):
|
|
|
try:
|
|
try:
|
|
|
data = self._read_json_body()
|
|
data = self._read_json_body()
|