Refactor image handling in character import/export functions to remove unnecessary reencoding

This commit is contained in:
Kwaroran
2024-12-10 22:47:11 +09:00
parent 59ff43a4d8
commit dd424d851a
2 changed files with 4 additions and 57 deletions

View File

@@ -277,7 +277,7 @@ export async function importCharacterProcess(f:{
if(parsed.spec !== 'chara_card_v2' && parsed.spec !== 'chara_card_v3'){ if(parsed.spec !== 'chara_card_v2' && parsed.spec !== 'chara_card_v3'){
const charaData:OldTavernChar = JSON.parse(Buffer.from(readedChara, 'base64').toString('utf-8')) const charaData:OldTavernChar = JSON.parse(Buffer.from(readedChara, 'base64').toString('utf-8'))
console.log(charaData) console.log(charaData)
const imgp = await saveAsset(await reencodeImage(img)) const imgp = await saveAsset(img)
db.characters.push(convertOffSpecCards(charaData, imgp)) db.characters.push(convertOffSpecCards(charaData, imgp))
setDatabaseLite(db) setDatabaseLite(db)
alertNormal(language.importedCharacter) alertNormal(language.importedCharacter)
@@ -633,7 +633,7 @@ async function importCharacterCardSpec(card:CharacterCardV2Risu|CharacterCardV3,
const data = card.data const data = card.data
console.log(card) console.log(card)
let im = img ? await saveAsset(await reencodeImage(img)) : undefined let im = img ? await saveAsset(img) : undefined
let db = getDatabase() let db = getDatabase()
const risuext = safeStructuredClone(data.extensions.risuai) const risuext = safeStructuredClone(data.extensions.risuai)
@@ -1140,7 +1140,7 @@ export async function exportCharacterCard(char:character, type:'png'|'json'|'cha
const spec:'v2'|'v3' = arg.spec ?? 'v2' //backward compatibility const spec:'v2'|'v3' = arg.spec ?? 'v2' //backward compatibility
try{ try{
char.image = '' char.image = ''
img = await reencodeImage(img) img = type === 'png' ? (await reencodeImage(img)) : img
const localWriter = arg.writer ?? (new LocalWriter()) const localWriter = arg.writer ?? (new LocalWriter())
if(!arg.writer && type !== 'json'){ if(!arg.writer && type !== 'json'){
const nameExt = { const nameExt = {

View File

@@ -2,14 +2,11 @@ import { get, writable } from "svelte/store";
import { saveImage, setDatabase, type character, type Chat, defaultSdDataFunc, type loreBook, getDatabase, getCharacterByIndex, setCharacterByIndex } from "./storage/database.svelte"; import { saveImage, setDatabase, type character, type Chat, defaultSdDataFunc, type loreBook, getDatabase, getCharacterByIndex, setCharacterByIndex } from "./storage/database.svelte";
import { alertAddCharacter, alertConfirm, alertError, alertNormal, alertSelect, alertStore, alertWait } from "./alert"; import { alertAddCharacter, alertConfirm, alertError, alertNormal, alertSelect, alertStore, alertWait } from "./alert";
import { language } from "../lang"; import { language } from "../lang";
import { decode as decodeMsgpack } from "msgpackr";
import { checkNullish, findCharacterbyId, getUserName, selectMultipleFile, selectSingleFile, sleep } from "./util"; import { checkNullish, findCharacterbyId, getUserName, selectMultipleFile, selectSingleFile, sleep } from "./util";
import { v4 as uuidv4 } from 'uuid'; import { v4 as uuidv4 } from 'uuid';
import { MobileGUIStack, OpenRealmStore, selectedCharID } from "./stores.svelte"; import { MobileGUIStack, OpenRealmStore, selectedCharID } from "./stores.svelte";
import { checkCharOrder, downloadFile, getFileSrc } from "./globalApi.svelte"; import { checkCharOrder, downloadFile, getFileSrc } from "./globalApi.svelte";
import { reencodeImage } from "./process/files/image";
import { updateInlayScreen } from "./process/inlayScreen"; import { updateInlayScreen } from "./process/inlayScreen";
import { PngChunk } from "./pngChunk";
import { parseMarkdownSafe } from "./parser.svelte"; import { parseMarkdownSafe } from "./parser.svelte";
import { translateHTML } from "./translator/translator"; import { translateHTML } from "./translator/translator";
import { doingChat } from "./process/index.svelte"; import { doingChat } from "./process/index.svelte";
@@ -84,7 +81,7 @@ export async function selectCharImg(charIndex:number) {
} }
const img = selected.data const img = selected.data
let db = getDatabase() let db = getDatabase()
const imgp = await saveImage(await reencodeImage(img)) const imgp = await saveImage(img)
dumpCharImage(charIndex) dumpCharImage(charIndex)
db.characters[charIndex].image = imgp db.characters[charIndex].image = imgp
setDatabase(db) setDatabase(db)
@@ -668,56 +665,6 @@ function dataURLtoBuffer(string:string){
return Buffer.from(data, 'base64'); return Buffer.from(data, 'base64');
} }
export async function addDefaultCharacters() {
const imgs = [fetch('/sample/rika.png'),fetch('/sample/yuzu.png')]
alertStore.set({
type: 'wait',
msg: `Loading Sample bots...`
})
for(const img of imgs){
const imgBuffer = await (await img).arrayBuffer()
const readed = PngChunk.read(Buffer.from(imgBuffer), ["risuai"])?.risuai
await sleep(10)
const va = decodeMsgpack(Buffer.from(readed,'base64')) as any
if(va.type !== 101){
alertError(language.errors.noData)
return
}
let char:character = va.data
let db = getDatabase()
if(char.emotionImages && char.emotionImages.length > 0){
for(let i=0;i<char.emotionImages.length;i++){
await sleep(10)
const imgp = await saveImage(char.emotionImages[i][1] as any)
char.emotionImages[i][1] = imgp
}
}
char.chats = [{
message: [],
note: '',
name: 'Chat 1',
localLore: []
}]
if(checkNullish(char.sdData)){
char.sdData = defaultSdDataFunc()
}
char.chatPage = 0
char.image = await saveImage(await reencodeImage(Buffer.from(imgBuffer)))
char.chaId = uuidv4()
db.characters.push(characterFormatUpdate(char))
setDatabase(db)
}
alertStore.set({
type: 'none',
msg: ''
})
}
export async function removeChar(index:number,name:string, type:'normal'|'permanent'|'permanentForce' = 'normal'){ export async function removeChar(index:number,name:string, type:'normal'|'permanent'|'permanentForce' = 'normal'){
const db = getDatabase() const db = getDatabase()
if(type !== 'permanentForce'){ if(type !== 'permanentForce'){