Prefer source images for MSR analysis
This commit is contained in:
@@ -27,12 +27,9 @@ function coercePreviewUrl(value) {
|
|||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
function resolvePreviewUrlFromOrigin(originNode) {
|
function resolveFileWidgetUrlFromOrigin(originNode) {
|
||||||
if (!originNode) return "";
|
if (!originNode) return "";
|
||||||
|
|
||||||
const preview = Array.isArray(originNode.imgs) ? coercePreviewUrl(originNode.imgs[0]) : "";
|
|
||||||
if (preview) return preview;
|
|
||||||
|
|
||||||
const widgets = originNode.widgets || [];
|
const widgets = originNode.widgets || [];
|
||||||
const fileWidget = widgets.find((widget) => ["image", "filename", "file"].includes(widget.name));
|
const fileWidget = widgets.find((widget) => ["image", "filename", "file"].includes(widget.name));
|
||||||
const subfolderWidget = widgets.find((widget) => widget.name === "subfolder");
|
const subfolderWidget = widgets.find((widget) => widget.name === "subfolder");
|
||||||
@@ -45,24 +42,49 @@ function resolvePreviewUrlFromOrigin(originNode) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function resolvePreviewUrlFromOrigin(originNode) {
|
||||||
|
if (!originNode) return "";
|
||||||
|
const preview = Array.isArray(originNode.imgs) ? coercePreviewUrl(originNode.imgs[0]) : "";
|
||||||
|
return preview || "";
|
||||||
|
}
|
||||||
|
|
||||||
|
function resolveCandidateImageUrls(originNode) {
|
||||||
|
const urls = [];
|
||||||
|
const fileUrl = resolveFileWidgetUrlFromOrigin(originNode);
|
||||||
|
const previewUrl = resolvePreviewUrlFromOrigin(originNode);
|
||||||
|
if (fileUrl) urls.push(fileUrl);
|
||||||
|
if (previewUrl && previewUrl !== fileUrl) urls.push(previewUrl);
|
||||||
|
return urls;
|
||||||
|
}
|
||||||
|
|
||||||
async function imageInputToDataUrl(node, inputName) {
|
async function imageInputToDataUrl(node, inputName) {
|
||||||
const originNode = getOriginNodeForInput(node, inputName);
|
const originNode = getOriginNodeForInput(node, inputName);
|
||||||
const previewUrl = resolvePreviewUrlFromOrigin(originNode);
|
const candidateUrls = resolveCandidateImageUrls(originNode);
|
||||||
if (!previewUrl) return null;
|
if (!candidateUrls.length) return null;
|
||||||
|
|
||||||
|
for (const imageUrl of candidateUrls) {
|
||||||
try {
|
try {
|
||||||
const response = await fetch(previewUrl);
|
const response = await fetch(imageUrl);
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error(`HTTP ${response.status}`);
|
||||||
|
}
|
||||||
const blob = await response.blob();
|
const blob = await response.blob();
|
||||||
|
if (!blob.type.startsWith("image/")) {
|
||||||
|
throw new Error(`Unexpected blob type: ${blob.type || "unknown"}`);
|
||||||
|
}
|
||||||
return await new Promise((resolve) => {
|
return await new Promise((resolve) => {
|
||||||
const reader = new FileReader();
|
const reader = new FileReader();
|
||||||
reader.onloadend = () => resolve(reader.result);
|
reader.onloadend = () => resolve(reader.result);
|
||||||
reader.readAsDataURL(blob);
|
reader.readAsDataURL(blob);
|
||||||
});
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("[MSRCharacter] Failed to load preview image", error);
|
console.warn("[MSRCharacter] Failed candidate image source", imageUrl, error);
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
function setWidgetValue(node, widget, value) {
|
function setWidgetValue(node, widget, value) {
|
||||||
if (!widget) return;
|
if (!widget) return;
|
||||||
const previous = widget.value;
|
const previous = widget.value;
|
||||||
@@ -120,7 +142,11 @@ function refreshCharacterPreview(node) {
|
|||||||
|
|
||||||
const inputNames = ["image_1", "image_2"];
|
const inputNames = ["image_1", "image_2"];
|
||||||
const previewUrls = inputNames
|
const previewUrls = inputNames
|
||||||
.map((inputName) => resolvePreviewUrlFromOrigin(getOriginNodeForInput(node, inputName)))
|
.map((inputName) => {
|
||||||
|
const originNode = getOriginNodeForInput(node, inputName);
|
||||||
|
const candidates = resolveCandidateImageUrls(originNode);
|
||||||
|
return candidates[0] || "";
|
||||||
|
})
|
||||||
.filter(Boolean);
|
.filter(Boolean);
|
||||||
|
|
||||||
const previewRow = node._msrPreviewRow;
|
const previewRow = node._msrPreviewRow;
|
||||||
|
|||||||
Reference in New Issue
Block a user