From 264d566c92086129765ea17448a9a6f282cbc69a Mon Sep 17 00:00:00 2001 From: Alexey Dashko Date: Thu, 6 Apr 2023 15:27:40 +0300 Subject: [PATCH 1/6] converting TavernAI characters back to png --- tools/charaverter/main.mjs | 99 ++++++++++++++++++++++++++++++++++ tools/charaverter/package.json | 6 +++ 2 files changed, 105 insertions(+) create mode 100644 tools/charaverter/main.mjs create mode 100644 tools/charaverter/package.json diff --git a/tools/charaverter/main.mjs b/tools/charaverter/main.mjs new file mode 100644 index 000000000..349d6d4aa --- /dev/null +++ b/tools/charaverter/main.mjs @@ -0,0 +1,99 @@ +import fs from 'fs'; +import jimp from 'jimp'; +import extract from 'png-chunks-extract'; +import encode from 'png-chunks-encode'; +import PNGtext from 'png-chunk-text'; +import ExifReader from 'exifreader'; +import webp from 'webp-converter'; +import path from 'path'; + +async function charaRead(img_url, input_format){ + let format; + if(input_format === undefined){ + if(img_url.indexOf('.webp') !== -1){ + format = 'webp'; + }else{ + format = 'png'; + } + }else{ + format = input_format; + } + + switch(format){ + case 'webp': + const exif_data = await ExifReader.load(fs.readFileSync(img_url)); + const char_data = exif_data['UserComment']['description']; + if (char_data === 'Undefined' && exif_data['UserComment'].value && exif_data['UserComment'].value.length === 1) { + return exif_data['UserComment'].value[0]; + } + return char_data; + case 'png': + const buffer = fs.readFileSync(img_url); + const chunks = extract(buffer); + + const textChunks = chunks.filter(function (chunk) { + return chunk.name === 'tEXt'; + }).map(function (chunk) { + //console.log(text.decode(chunk.data)); + return PNGtext.decode(chunk.data); + }); + var base64DecodedData = Buffer.from(textChunks[0].text, 'base64').toString('utf8'); + return base64DecodedData;//textChunks[0].text; + //console.log(textChunks[0].keyword); // 'hello' + //console.log(textChunks[0].text); // 'world' + default: + break; + } + +} + +async function charaWrite(img_url, data, target_img, response = undefined, mes = 'ok') { + try { + // Read the image, resize, and save it as a PNG into the buffer + + webp + + const rawImg = await jimp.read(img_url); + const image = await rawImg.cover(400, 600).getBufferAsync(jimp.MIME_PNG); + + // Get the chunks + const chunks = extract(image); + const tEXtChunks = chunks.filter(chunk => chunk.create_date === 'tEXt'); + + // Remove all existing tEXt chunks + for (let tEXtChunk of tEXtChunks) { + chunks.splice(chunks.indexOf(tEXtChunk), 1); + } + // Add new chunks before the IEND chunk + const base64EncodedData = Buffer.from(data, 'utf8').toString('base64'); + chunks.splice(-1, 0, PNGtext.encode('chara', base64EncodedData)); + //chunks.splice(-1, 0, text.encode('lorem', 'ipsum')); + + fs.writeFileSync(target_img, new Buffer.from(encode(chunks))); + if (response !== undefined) response.send(mes); + + + } catch (err) { + console.log(err); + if (response !== undefined) response.send(err); + } +} + + +const p = process.argv[2] +const files = fs.readdirSync(p).filter() + +const dst = "characters" + +try { fs.mkdirSync(dst) } catch {} + +for(const f of files) { + const source = path.join(p, f), + dest = path.join(dst, path.basename(f).split(".")[0] + ".png") + console.log(`Read... ${source}`) + const data = await charaRead(source) + console.log(`Convert... ${source} -> ${dest}`) + await webp.dwebp(source, dest, "-o") + console.log(`Write... ${dest}`) + await charaWrite(dest, data, dest) +} \ No newline at end of file diff --git a/tools/charaverter/package.json b/tools/charaverter/package.json new file mode 100644 index 000000000..31ce1f5c2 --- /dev/null +++ b/tools/charaverter/package.json @@ -0,0 +1,6 @@ +{ + "dependencies": { + "webp-converter": "^2.3.3", + "exifreader": "^4.12.0" + } +} \ No newline at end of file From b0e72bd9693a396af13331691c978f074aaf9f7c Mon Sep 17 00:00:00 2001 From: Alexey Dashko Date: Thu, 6 Apr 2023 15:50:58 +0300 Subject: [PATCH 2/6] webp filter + packages --- tools/charaverter/main.mjs | 2 +- tools/charaverter/package.json | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/tools/charaverter/main.mjs b/tools/charaverter/main.mjs index 349d6d4aa..17954585f 100644 --- a/tools/charaverter/main.mjs +++ b/tools/charaverter/main.mjs @@ -81,7 +81,7 @@ async function charaWrite(img_url, data, target_img, response = undefined, mes = const p = process.argv[2] -const files = fs.readdirSync(p).filter() +const files = fs.readdirSync(p).filter(e => e.endsWith(".webp")) const dst = "characters" diff --git a/tools/charaverter/package.json b/tools/charaverter/package.json index 31ce1f5c2..5f4db5583 100644 --- a/tools/charaverter/package.json +++ b/tools/charaverter/package.json @@ -1,6 +1,10 @@ { "dependencies": { - "webp-converter": "^2.3.3", - "exifreader": "^4.12.0" + "exifreader": "^4.12.0", + "jimp": "^0.22.7", + "png-chunk-text": "^1.0.0", + "png-chunks-encode": "^1.0.0", + "png-chunks-extract": "^1.0.0", + "webp-converter": "^2.3.3" } -} \ No newline at end of file +} From d9a8598632e6fa20c02754a7aff5f37666801d08 Mon Sep 17 00:00:00 2001 From: Alexey Dashko Date: Thu, 6 Apr 2023 15:55:59 +0300 Subject: [PATCH 3/6] dst to src remove old after convert --- tools/charaverter/main.mjs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/charaverter/main.mjs b/tools/charaverter/main.mjs index 17954585f..dd9669028 100644 --- a/tools/charaverter/main.mjs +++ b/tools/charaverter/main.mjs @@ -83,7 +83,7 @@ async function charaWrite(img_url, data, target_img, response = undefined, mes = const p = process.argv[2] const files = fs.readdirSync(p).filter(e => e.endsWith(".webp")) -const dst = "characters" +const dst = p try { fs.mkdirSync(dst) } catch {} @@ -96,4 +96,5 @@ for(const f of files) { await webp.dwebp(source, dest, "-o") console.log(`Write... ${dest}`) await charaWrite(dest, data, dest) + fs.rmSync(source) } \ No newline at end of file From e30b7a4448aae320c8b64e9e71a70efee33b7ef8 Mon Sep 17 00:00:00 2001 From: Alexey Dashko Date: Thu, 6 Apr 2023 15:59:36 +0300 Subject: [PATCH 4/6] nothing to convert message --- tools/charaverter/main.mjs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tools/charaverter/main.mjs b/tools/charaverter/main.mjs index dd9669028..633689bbc 100644 --- a/tools/charaverter/main.mjs +++ b/tools/charaverter/main.mjs @@ -82,6 +82,10 @@ async function charaWrite(img_url, data, target_img, response = undefined, mes = const p = process.argv[2] const files = fs.readdirSync(p).filter(e => e.endsWith(".webp")) +if (!files.length) { + console.log("Nothing to convert.") + process.exit(0) +} const dst = p From a501f59445cdc287b6ce794a6036235be8c393b8 Mon Sep 17 00:00:00 2001 From: Alexey Dashko Date: Thu, 6 Apr 2023 16:02:52 +0300 Subject: [PATCH 5/6] suffix instead of split --- tools/charaverter/main.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/charaverter/main.mjs b/tools/charaverter/main.mjs index 633689bbc..db7640311 100644 --- a/tools/charaverter/main.mjs +++ b/tools/charaverter/main.mjs @@ -93,7 +93,7 @@ try { fs.mkdirSync(dst) } catch {} for(const f of files) { const source = path.join(p, f), - dest = path.join(dst, path.basename(f).split(".")[0] + ".png") + dest = path.join(dst, path.basename(f, ".webp") + ".png") console.log(`Read... ${source}`) const data = await charaRead(source) console.log(`Convert... ${source} -> ${dest}`) From 9303a75ad69eabcac58f18767aa72c05833093c7 Mon Sep 17 00:00:00 2001 From: Alexey Dashko Date: Thu, 6 Apr 2023 16:08:11 +0300 Subject: [PATCH 6/6] dest path option --- tools/charaverter/main.mjs | 44 ++++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/tools/charaverter/main.mjs b/tools/charaverter/main.mjs index db7640311..c3fda1729 100644 --- a/tools/charaverter/main.mjs +++ b/tools/charaverter/main.mjs @@ -80,25 +80,31 @@ async function charaWrite(img_url, data, target_img, response = undefined, mes = } -const p = process.argv[2] -const files = fs.readdirSync(p).filter(e => e.endsWith(".webp")) -if (!files.length) { - console.log("Nothing to convert.") - process.exit(0) -} +(async function() { + const spath = process.argv[2] + const dpath = process.argv[3] || spath + const files = fs.readdirSync(spath).filter(e => e.endsWith(".webp")) + if (!files.length) { + console.log("Nothing to convert.") + return + } -const dst = p + try { fs.mkdirSync(dpath) } catch {} -try { fs.mkdirSync(dst) } catch {} + for(const f of files) { + const source = path.join(spath, f), + dest = path.join(dpath, path.basename(f, ".webp") + ".png") -for(const f of files) { - const source = path.join(p, f), - dest = path.join(dst, path.basename(f, ".webp") + ".png") - console.log(`Read... ${source}`) - const data = await charaRead(source) - console.log(`Convert... ${source} -> ${dest}`) - await webp.dwebp(source, dest, "-o") - console.log(`Write... ${dest}`) - await charaWrite(dest, data, dest) - fs.rmSync(source) -} \ No newline at end of file + console.log(`Read... ${source}`) + const data = await charaRead(source) + + console.log(`Convert... ${source} -> ${dest}`) + await webp.dwebp(source, dest, "-o") + + console.log(`Write... ${dest}`) + await charaWrite(dest, data, dest) + + console.log(`Remove... ${source}`) + fs.rmSync(source) + } +})() \ No newline at end of file