Fix API endpoint to work with symlinks / external folders

Fixes #217
This commit is contained in:
DominikDoom
2023-08-07 22:15:48 +02:00
parent 16bc6d8868
commit f63bbf947f
2 changed files with 36 additions and 16 deletions

View File

@@ -84,10 +84,18 @@ async function fetchAPI(url, json = true, cache = false) {
// Extra network preview thumbnails
async function getExtraNetworkPreviewURL(filename, type) {
const previewJSON = await fetchAPI(`tacapi/v1/thumb-preview/${filename}?type=${type}`, true, true);
if (previewJSON?.url)
return `file=${previewJSON.url}`;
else
if (previewJSON?.url) {
const properURL = `sd_extra_networks/thumb?filename=${previewJSON.url}`;
if ((await fetch(properURL)).status == 200) {
return properURL;
} else {
// create blob url
const blob = await (await fetch(`tacapi/v1/thumb-preview-blob/${filename}?type=${type}`)).blob();
return URL.createObjectURL(blob);
}
} else {
return null;
}
}
// Debounce function to prevent spamming the autocomplete function

View File

@@ -459,15 +459,18 @@ def api_tac(_: gr.Blocks, app: FastAPI):
except Exception as e:
return json.dumps({"error": e})
async def get_preview_thumbnail(base_path: Path, filename: str = None):
async def get_preview_thumbnail(base_path: Path, filename: str = None, blob: bool = False):
if base_path is None or (not base_path.exists()):
return json.dumps({})
try:
img_glob = glob.glob(base_path.as_posix() + f"/**/{filename}.*", recursive=True)
img_candidates = [img for img in img_glob if Path(img).suffix in [".png", ".jpg", ".jpeg", ".webp"]]
img_candidates = [img for img in img_glob if Path(img).suffix in [".png", ".jpg", ".jpeg", ".webp", ".gif"]]
if img_candidates is not None and len(img_candidates) > 0:
return JSONResponse({"url": urllib.parse.quote(img_candidates[0])})
if blob:
return FileResponse(img_candidates[0])
else:
return JSONResponse({"url": urllib.parse.quote(img_candidates[0])})
except Exception as e:
return json.dumps({"error": e})
@@ -479,18 +482,27 @@ def api_tac(_: gr.Blocks, app: FastAPI):
async def get_lyco_info(lyco_name):
return await get_json_info(LYCO_PATH, lyco_name)
def get_path_for_type(type):
if type == "lora":
return LORA_PATH
elif type == "lyco":
return LYCO_PATH
elif type == "hyper":
return HYP_PATH
elif type == "embed":
return EMB_PATH
else:
return None
@app.get("/tacapi/v1/thumb-preview/{filename}")
async def get_thumb_preview(filename, type):
if type == "lora":
return await get_preview_thumbnail(LORA_PATH, filename)
elif type == "lyco":
return await get_preview_thumbnail(LYCO_PATH, filename)
elif type == "hyper":
return await get_preview_thumbnail(HYP_PATH, filename)
elif type == "embed":
return await get_preview_thumbnail(EMB_PATH, filename)
else:
return "Invalid type"
return await get_preview_thumbnail(get_path_for_type(type), filename, False)
@app.get("/tacapi/v1/thumb-preview-blob/{filename}")
async def get_thumb_preview_blob(filename, type):
return await get_preview_thumbnail(get_path_for_type(type), filename, True)
script_callbacks.on_app_started(api_tac)