[feat] apply yuso

This commit is contained in:
kwaroran
2023-07-24 20:55:43 +09:00
parent ca2096b4b8
commit 0d8dab3564
6 changed files with 103 additions and 133 deletions

View File

@@ -1,17 +1,15 @@
import { get, writable, type Writable } from "svelte/store"
import { alertConfirm, alertError, alertMd, alertNormal, alertSelect, alertStore, alertTOS } from "./alert"
import { DataBase, defaultSdDataFunc, type character, setDatabase, type customscript, type loreSettings, type loreBook } from "./storage/database"
import { checkNullish, selectMultipleFile, selectSingleFile, sleep } from "./util"
import { checkNullish, selectMultipleFile, sleep } from "./util"
import { language } from "src/lang"
import { encode as encodeMsgpack, decode as decodeMsgpack } from "msgpackr";
import { v4 as uuidv4 } from 'uuid';
import exifr from 'exifr'
import { PngMetadata } from "./exif"
import { characterFormatUpdate } from "./characters"
import { checkCharOrder, downloadFile, readImage, saveAsset } from "./storage/globalApi"
import { cloneDeep } from "lodash"
import { selectedCharID } from "./stores"
import { convertImage } from "./parser"
import * as yuso from 'yuso'
export const hubURL = "https://sv.risuai.xyz"
@@ -60,69 +58,22 @@ async function importCharacterProcess(f:{
})
await sleep(10)
const img = f.data
const readed = (await exifr.parse(img, true))
if(readed.chara){
// standard spec v2 imports
const charaData:CharacterCardV2 = JSON.parse(Buffer.from(readed.chara, 'base64').toString('utf-8'))
const readed = yuso.decode(img, 'chara')
{
const charaData:CharacterCardV2 = JSON.parse(Buffer.from(readed, 'base64').toString('utf-8'))
if(await importSpecv2(charaData, img)){
let db = get(DataBase)
return db.characters.length - 1
}
}
if(readed.risuai){
// old risu imports
await sleep(10)
const va = decodeMsgpack(Buffer.from(readed.risuai, 'base64')) as any
if(va.type !== 101){
alertError(language.errors.noData)
return
}
let char:character = va.data
let db = get(DataBase)
if(char.emotionImages && char.emotionImages.length > 0){
for(let i=0;i<char.emotionImages.length;i++){
alertStore.set({
type: 'wait',
msg: `Loading... (Getting Emotions ${i} / ${char.emotionImages.length})`
})
await sleep(10)
const imgp = await saveAsset(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 saveAsset(PngMetadata.filter(img))
db.characters.push(characterFormatUpdate(char))
char.chaId = uuidv4()
setDatabase(db)
alertNormal(language.importedCharacter)
return db.characters.length - 1
}
else if(readed.chara){
const charaData:OldTavernChar = JSON.parse(Buffer.from(readed.chara, 'base64').toString('utf-8'))
const imgp = await saveAsset(PngMetadata.filter(img))
let db = get(DataBase)
db.characters.push(convertOldTavernAndJSON(charaData, imgp))
DataBase.set(db)
alertNormal(language.importedCharacter)
return db.characters.length - 1
}
else{
alertError(language.errors.noData)
return null
}
const charaData:OldTavernChar = JSON.parse(Buffer.from(readed, 'base64').toString('utf-8'))
const imgp = await saveAsset(yuso.trim(img))
let db = get(DataBase)
db.characters.push(convertOldTavernAndJSON(charaData, imgp))
DataBase.set(db)
alertNormal(language.importedCharacter)
return db.characters.length - 1
}
export const showRealmInfoStore:Writable<null|hubType> = writable(null)
@@ -170,18 +121,18 @@ export async function characterURLImport() {
})
const img = new Uint8Array(await chara.arrayBuffer())
const readed = (await exifr.parse(img, true))
const readed = (yuso.decode(img, "chara"))
{
const charaData:CharacterCardV2 = JSON.parse(Buffer.from(readed.chara, 'base64').toString('utf-8'))
const charaData:CharacterCardV2 = JSON.parse(Buffer.from(readed, 'base64').toString('utf-8'))
if(await importSpecv2(charaData, img)){
checkCharOrder()
return
}
}
{
const imgp = await saveAsset(PngMetadata.filter(img))
const imgp = await saveAsset(yuso.trim(img))
let db = get(DataBase)
const charaData:OldTavernChar = JSON.parse(Buffer.from(readed.chara, 'base64').toString('utf-8'))
const charaData:OldTavernChar = JSON.parse(Buffer.from(readed, 'base64').toString('utf-8'))
db.characters.push(convertOldTavernAndJSON(charaData, imgp))
DataBase.set(db)
@@ -268,7 +219,7 @@ async function importSpecv2(card:CharacterCardV2, img?:Uint8Array, mode?:'hub'|'
}
const data = card.data
const im = img ? await saveAsset(PngMetadata.filter(img)) : undefined
const im = img ? await saveAsset(yuso.trim(img)) : undefined
let db = get(DataBase)
const risuext = cloneDeep(data.extensions.risuai)
@@ -517,9 +468,8 @@ export async function exportSpecV2(char:character, type:'png'|'json' = 'png') {
})
await sleep(10)
img = PngMetadata.write(img, {
'chara': Buffer.from(JSON.stringify(card)).toString('base64'),
})
img = yuso.encode(img, "chara",Buffer.from(JSON.stringify(card)).toString('base64'))
alertStore.set({
type: 'wait',

View File

@@ -1,14 +1,13 @@
import { get, writable } from "svelte/store";
import { DataBase, saveImage, setDatabase, type character, type Chat, defaultSdDataFunc } from "./storage/database";
import exifr from 'exifr'
import { alertConfirm, alertError, alertNormal, alertSelect, alertStore } from "./alert";
import { language } from "../lang";
import { PngMetadata } from "./exif";
import { encode as encodeMsgpack, decode as decodeMsgpack } from "msgpackr";
import { checkNullish, findCharacterbyId, selectMultipleFile, selectSingleFile, sleep } from "./util";
import { v4 as uuidv4 } from 'uuid';
import { selectedCharID } from "./stores";
import { checkCharOrder, downloadFile, getFileSrc, readImage } from "./storage/globalApi";
import * as yuso from 'yuso'
export function createNewCharacter() {
let db = get(DataBase)
@@ -493,9 +492,9 @@ export async function addDefaultCharacters() {
for(const img of imgs){
const imgBuffer = await (await img).arrayBuffer()
const readed = (await exifr.parse(imgBuffer, true))
const readed = yuso.decode(Buffer.from(imgBuffer), "risuai")
await sleep(10)
const va = decodeMsgpack(Buffer.from(readed.risuai, 'base64')) as any
const va = decodeMsgpack(Buffer.from(readed,'base64')) as any
if(va.type !== 101){
alertError(language.errors.noData)
return
@@ -521,7 +520,7 @@ export async function addDefaultCharacters() {
}
char.chatPage = 0
char.image = await saveImage(PngMetadata.filter(Buffer.from(imgBuffer)))
char.image = await saveImage(yuso.trim(Buffer.from(imgBuffer)))
char.chaId = uuidv4()
db.characters.push(characterFormatUpdate(char))
setDatabase(db)

View File

@@ -1,57 +0,0 @@
import extract from 'png-chunks-extract';
import encode from 'png-chunks-encode';
import textKey from 'png-chunk-text'
export const PngMetadata = {
write: (pngBuffer: Uint8Array, metadata: Record<string, string>): Buffer => {
let chunks:{
name:string
data:Uint8Array
}[] = extract(Buffer.from(pngBuffer));
chunks = chunks.filter((v) => {
return v.name.toLocaleLowerCase() !== 'text'
})
for (const key in metadata) {
const value = metadata[key];
chunks.splice(-1, 0, textKey.encode(key, value))
}
const encoded = encode(chunks);
return encoded
},
writeStream:(pngBuffer: Uint8Array, metadata: Record<string, string>): Buffer => {
let chunks:{
name:string
data:Uint8Array
}[] = extract(Buffer.from(pngBuffer));
chunks = chunks.filter((v) => {
return v.name.toLocaleLowerCase() !== 'text'
})
for (const key in metadata) {
const value = metadata[key];
chunks.splice(-1, 0, textKey.encode(key, value))
}
const encoded = encode(chunks);
return encoded
},
filter: (pngBuffer: Uint8Array) => {
try {
let chunks:{
name:string
data:Uint8Array
}[] = extract(Buffer.from(pngBuffer));
chunks = chunks.filter((v) => {
return v.name.toLocaleLowerCase() !== 'text'
})
const encoded = encode(chunks);
return encoded
} catch (error) {
return pngBuffer
}
}
}