Add images to lorecards

This commit is contained in:
somebody
2022-11-25 12:37:04 -06:00
parent 27f89df9d9
commit 8a027c08d9

View File

@@ -4466,11 +4466,14 @@ async function postWI(wiData) {
} }
} }
async function loadNAILorebook(data, filename) { async function loadNAILorebook(data, filename, image=null) {
let lorebookVersion = data.lorebookVersion; let lorebookVersion = data.lorebookVersion;
let wi_data = {folders: {[filename]: []}, entries: {}}; let wi_data = {folders: {[filename]: []}, entries: {}};
console.log(`Loading NAI lorebook version ${lorebookVersion}`); console.log(`Loading NAI lorebook version ${lorebookVersion}`);
let base = Math.max(...Object.keys(world_info_data).map(Number)) + 1;
if (base < 0) base = 0;
let i = 0; let i = 0;
for (const entry of data.entries) { for (const entry of data.entries) {
// contextConfig: Object { suffix: "\n", tokenBudget: 2048, reservedTokens: 0, … } // contextConfig: Object { suffix: "\n", tokenBudget: 2048, reservedTokens: 0, … }
@@ -4499,10 +4502,25 @@ async function loadNAILorebook(data, filename) {
}; };
wi_data.folders[filename].push(i); wi_data.folders[filename].push(i);
i++; i++;
} }
await postWI(wi_data); await postWI(wi_data);
if (image) {
for (let offset=0;offset<i;offset++) {
let uid = base+offset;
const imageEl = $el(`#world_info_image_${uid}`);
if (imageEl) imageEl.src = image;
let r = await fetch(`/set_wi_image/${uid}`, {
method: "POST",
body: image
});
}
}
} }
async function loadKoboldData(data, filename) { async function loadKoboldData(data, filename) {
@@ -4521,44 +4539,60 @@ async function loadKoboldData(data, filename) {
} }
} }
function readLoreCard(file) { async function blob2Base64(blob) {
return new Promise(function(resolve, reject) {
const reader = new FileReader();
reader.readAsDataURL(blob);
reader.onload = () => resolve(reader.result);
reader.onerror = error => reject(error);
});
}
async function blob2ArrayBuffer(blob) {
return new Promise(function(resolve, reject) {
const reader = new FileReader();
reader.readAsArrayBuffer(blob);
reader.onload = () => resolve(reader.result);
reader.onerror = error => reject(error);
});
}
async function readLoreCard(file) {
// "naidata" // "naidata"
const magicNumber = new Uint8Array([0x6e, 0x61, 0x69, 0x64, 0x61, 0x74, 0x61]); const magicNumber = new Uint8Array([0x6e, 0x61, 0x69, 0x64, 0x61, 0x74, 0x61]);
let filename = file.name; let filename = file.name;
let reader = new FileReader(); let reader = new FileReader();
reader.readAsArrayBuffer(file);
reader.addEventListener("load", function() { let bin = new Uint8Array(await blob2ArrayBuffer(file))
let bin = new Uint8Array(reader.result);
// naidata is prefixed with magic number // naidata is prefixed with magic number
let offset = bin.findIndex(function(item, possibleIndex, array) { let offset = bin.findIndex(function(item, possibleIndex, array) {
for (let i=0;i<magicNumber.length;i++) { for (let i=0;i<magicNumber.length;i++) {
if (bin[i + possibleIndex] !== magicNumber[i]) return false; if (bin[i + possibleIndex] !== magicNumber[i]) return false;
}
return true;
});
if (offset === null) {
reportError("Error reading Lorecard", "Unable to find NAIDATA offset. Is this a valid Lorecard?");
throw Error("Couldn't find offset!");
} }
return true;
let lengthBytes = bin.slice(offset - 8, offset - 4); });
let length = 0;
if (offset === null) {
for (const byte of lengthBytes) { reportError("Error reading Lorecard", "Unable to find NAIDATA offset. Is this a valid Lorecard?");
length = (length << 8) + byte; throw Error("Couldn't find offset!");
} }
let binData = bin.slice(offset + 8, offset + length); let lengthBytes = bin.slice(offset - 8, offset - 4);
let length = 0;
// Encoded in base64
let data = atob(new TextDecoder().decode(binData)); for (const byte of lengthBytes) {
let j = JSON.parse(data); length = (length << 8) + byte;
loadNAILorebook(j, filename); }
})
let binData = bin.slice(offset + 8, offset + length);
// Encoded in base64
let data = atob(new TextDecoder().decode(binData));
let j = JSON.parse(data);
let b64Image = await blob2Base64(file);
loadNAILorebook(j, filename, b64Image);
} }
async function processDroppedFile(file) { async function processDroppedFile(file) {