From c7cbeed9bb1b73ccb011ad2ba5da373837109360 Mon Sep 17 00:00:00 2001 From: d-ber Date: Sun, 5 Jan 2025 22:36:10 +0100 Subject: [PATCH 1/5] speed up char import by postponing tag import --- public/script.js | 42 ++++++++++++++++++++++++++++++++---------- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/public/script.js b/public/script.js index d5ed97d4d..ece64ac58 100644 --- a/public/script.js +++ b/public/script.js @@ -8851,22 +8851,43 @@ export async function processDroppedFiles(files, data = new Map()) { 'charx', ]; + const avatarFileNames = []; for (const file of files) { const extension = file.name.split('.').pop().toLowerCase(); if (allowedMimeTypes.some(x => file.type.startsWith(x)) || allowedExtensions.includes(extension)) { const preservedName = data instanceof Map && data.get(file); - await importCharacter(file, preservedName); + const avatarFileName = await importCharacter(file, preservedName); + if (avatarFileName !== undefined){ + avatarFileNames.push(avatarFileName); + } } else { toastr.warning(t`Unsupported file type: ` + file.name); } } + + await ImportMultipleCharactersTags(avatarFileNames); +} + +/** + * Imports tags for the given characters + * @param {string[]} avatarFileNames character avatar filenames whose tags are to import + */ +async function ImportMultipleCharactersTags(avatarFileNames) { + await getCharacters(); + const currentContext = getContext(); + for (let i = 0; i < avatarFileNames.length; i++) { + if (power_user.tag_import_setting !== tag_import_setting.NONE) { + const importedCharacter = currentContext.characters.find(character => character.avatar === avatarFileNames[i]); + await importTags(importedCharacter); + } + } } /** * Imports a character from a file. * @param {File} file File to import * @param {string?} preserveFileName Whether to preserve original file name - * @returns {Promise} + * @returns {Promise} */ async function importCharacter(file, preserveFileName = '') { if (is_group_generating || is_send_press) { @@ -8909,14 +8930,9 @@ async function importCharacter(file, preserveFileName = '') { oldSelectedChar = characters[this_chid].avatar; } - await getCharacters(); select_rm_info('char_import', data.file_name, oldSelectedChar); - if (power_user.tag_import_setting !== tag_import_setting.NONE) { - let currentContext = getContext(); - let avatarFileName = `${data.file_name}.png`; - let importedCharacter = currentContext.characters.find(character => character.avatar === avatarFileName); - await importTags(importedCharacter); - } + let avatarFileName = `${data.file_name}.png`; + return avatarFileName; } } @@ -10795,9 +10811,15 @@ jQuery(async function () { return; } + const avatarFileNames = []; for (const file of e.target.files) { - await importCharacter(file); + const avatarFileName = await importCharacter(file); + if (avatarFileName !== undefined){ + avatarFileNames.push(avatarFileName); + } } + + await ImportMultipleCharactersTags(avatarFileNames); }); $('#export_button').on('click', function () { From 96cd683d0eb1f772d1c585c8452a6a3bc3bf0fee Mon Sep 17 00:00:00 2001 From: d-ber Date: Mon, 6 Jan 2025 00:28:38 +0100 Subject: [PATCH 2/5] added tag import back into importCharacter --- public/script.js | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/public/script.js b/public/script.js index ece64ac58..587c36ba7 100644 --- a/public/script.js +++ b/public/script.js @@ -8856,7 +8856,7 @@ export async function processDroppedFiles(files, data = new Map()) { const extension = file.name.split('.').pop().toLowerCase(); if (allowedMimeTypes.some(x => file.type.startsWith(x)) || allowedExtensions.includes(extension)) { const preservedName = data instanceof Map && data.get(file); - const avatarFileName = await importCharacter(file, preservedName); + const avatarFileName = await importCharacter(file, {preserveFileName: preservedName}); if (avatarFileName !== undefined){ avatarFileNames.push(avatarFileName); } @@ -8865,14 +8865,14 @@ export async function processDroppedFiles(files, data = new Map()) { } } - await ImportMultipleCharactersTags(avatarFileNames); + await ImportCharactersTags(avatarFileNames); } /** * Imports tags for the given characters * @param {string[]} avatarFileNames character avatar filenames whose tags are to import */ -async function ImportMultipleCharactersTags(avatarFileNames) { +async function ImportCharactersTags(avatarFileNames) { await getCharacters(); const currentContext = getContext(); for (let i = 0; i < avatarFileNames.length; i++) { @@ -8886,10 +8886,12 @@ async function ImportMultipleCharactersTags(avatarFileNames) { /** * Imports a character from a file. * @param {File} file File to import - * @param {string?} preserveFileName Whether to preserve original file name + * @param {object} [options] - Options + * @param {string} [options.preserveFileName] Whether to preserve original file name + * @param {Boolean} [options.importTags=false] Whether to import tags * @returns {Promise} */ -async function importCharacter(file, preserveFileName = '') { +async function importCharacter(file, {preserveFileName = '', importTags = false} = {}) { if (is_group_generating || is_send_press) { toastr.error(t`Cannot import characters while generating. Stop the request and try again.`, t`Import aborted`); throw new Error('Cannot import character while generating'); @@ -8932,6 +8934,9 @@ async function importCharacter(file, preserveFileName = '') { select_rm_info('char_import', data.file_name, oldSelectedChar); let avatarFileName = `${data.file_name}.png`; + if (importTags) { + ImportCharactersTags([avatarFileName]) + } return avatarFileName; } } @@ -10818,8 +10823,7 @@ jQuery(async function () { avatarFileNames.push(avatarFileName); } } - - await ImportMultipleCharactersTags(avatarFileNames); + await ImportCharactersTags(avatarFileNames); }); $('#export_button').on('click', function () { From c22ed52c72d0e3cb7d94b99f310295367c244de2 Mon Sep 17 00:00:00 2001 From: d-ber Date: Mon, 6 Jan 2025 21:35:03 +0100 Subject: [PATCH 3/5] fix function name, and minor fixes --- public/script.js | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/public/script.js b/public/script.js index 587c36ba7..caf4d8468 100644 --- a/public/script.js +++ b/public/script.js @@ -8865,19 +8865,18 @@ export async function processDroppedFiles(files, data = new Map()) { } } - await ImportCharactersTags(avatarFileNames); + await importCharactersTags(avatarFileNames); } /** * Imports tags for the given characters * @param {string[]} avatarFileNames character avatar filenames whose tags are to import */ -async function ImportCharactersTags(avatarFileNames) { +async function importCharactersTags(avatarFileNames) { await getCharacters(); - const currentContext = getContext(); for (let i = 0; i < avatarFileNames.length; i++) { if (power_user.tag_import_setting !== tag_import_setting.NONE) { - const importedCharacter = currentContext.characters.find(character => character.avatar === avatarFileNames[i]); + const importedCharacter = characters.find(character => character.avatar === avatarFileNames[i]); await importTags(importedCharacter); } } @@ -8935,7 +8934,7 @@ async function importCharacter(file, {preserveFileName = '', importTags = false} select_rm_info('char_import', data.file_name, oldSelectedChar); let avatarFileName = `${data.file_name}.png`; if (importTags) { - ImportCharactersTags([avatarFileName]) + await importCharactersTags([avatarFileName]) } return avatarFileName; } @@ -10823,7 +10822,7 @@ jQuery(async function () { avatarFileNames.push(avatarFileName); } } - await ImportCharactersTags(avatarFileNames); + await importCharactersTags(avatarFileNames); }); $('#export_button').on('click', function () { From d4f23de003997002d33f99bec8a824177f4a0b73 Mon Sep 17 00:00:00 2001 From: d-ber Date: Mon, 6 Jan 2025 22:41:32 +0100 Subject: [PATCH 4/5] fix toasts and final char selection --- public/script.js | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/public/script.js b/public/script.js index caf4d8468..7029de053 100644 --- a/public/script.js +++ b/public/script.js @@ -7299,7 +7299,7 @@ export function select_rm_info(type, charId, previousCharId = null) { // Set a timeout so multiple flashes don't overlap clearTimeout(importFlashTimeout); importFlashTimeout = setTimeout(function () { - if (type === 'char_import' || type === 'char_create') { + if (type === 'char_import' || type === 'char_create' || type === 'char_import_no_toast') { // Find the page at which the character is located const avatarFileName = charId; const charData = getEntitiesList({ doFilter: true }); @@ -8865,7 +8865,10 @@ export async function processDroppedFiles(files, data = new Map()) { } } - await importCharactersTags(avatarFileNames); + if (avatarFileNames.length > 0){ + await importCharactersTags(avatarFileNames); + selectImportedChar(avatarFileNames[avatarFileNames.length - 1]); + } } /** @@ -8882,6 +8885,18 @@ async function importCharactersTags(avatarFileNames) { } } +/** + * Selects the given imported char + * @param {string} charId char to select + */ +function selectImportedChar(charId) { + let oldSelectedChar = null; + if (this_chid !== undefined) { + oldSelectedChar = characters[this_chid].avatar; + } + select_rm_info('char_import_no_toast', charId, oldSelectedChar); +} + /** * Imports a character from a file. * @param {File} file File to import @@ -8926,15 +8941,12 @@ async function importCharacter(file, {preserveFileName = '', importTags = false} if (data.file_name !== undefined) { $('#character_search_bar').val('').trigger('input'); - let oldSelectedChar = null; - if (this_chid !== undefined) { - oldSelectedChar = characters[this_chid].avatar; - } - - select_rm_info('char_import', data.file_name, oldSelectedChar); + toastr.success(t`Character Created: ${String(data.file_name).replace('.png', '')}`); let avatarFileName = `${data.file_name}.png`; if (importTags) { - await importCharactersTags([avatarFileName]) + await importCharactersTags([avatarFileName]); + + selectImportedChar(data.file_name); } return avatarFileName; } @@ -10822,7 +10834,11 @@ jQuery(async function () { avatarFileNames.push(avatarFileName); } } - await importCharactersTags(avatarFileNames); + + if (avatarFileNames.length > 0){ + await importCharactersTags(avatarFileNames); + selectImportedChar(avatarFileNames[avatarFileNames.length - 1]); + } }); $('#export_button').on('click', function () { From 2ab59f5a7a157a98ab7bcc83b319b6e740f84f3e Mon Sep 17 00:00:00 2001 From: Cohee <18619528+Cohee1207@users.noreply.github.com> Date: Thu, 9 Jan 2025 22:57:43 +0200 Subject: [PATCH 5/5] chore: reformat new code --- public/script.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/public/script.js b/public/script.js index 7029de053..bbae531d7 100644 --- a/public/script.js +++ b/public/script.js @@ -8856,8 +8856,8 @@ export async function processDroppedFiles(files, data = new Map()) { const extension = file.name.split('.').pop().toLowerCase(); if (allowedMimeTypes.some(x => file.type.startsWith(x)) || allowedExtensions.includes(extension)) { const preservedName = data instanceof Map && data.get(file); - const avatarFileName = await importCharacter(file, {preserveFileName: preservedName}); - if (avatarFileName !== undefined){ + const avatarFileName = await importCharacter(file, { preserveFileName: preservedName }); + if (avatarFileName !== undefined) { avatarFileNames.push(avatarFileName); } } else { @@ -8865,7 +8865,7 @@ export async function processDroppedFiles(files, data = new Map()) { } } - if (avatarFileNames.length > 0){ + if (avatarFileNames.length > 0) { await importCharactersTags(avatarFileNames); selectImportedChar(avatarFileNames[avatarFileNames.length - 1]); } @@ -8905,7 +8905,7 @@ function selectImportedChar(charId) { * @param {Boolean} [options.importTags=false] Whether to import tags * @returns {Promise} */ -async function importCharacter(file, {preserveFileName = '', importTags = false} = {}) { +async function importCharacter(file, { preserveFileName = '', importTags = false } = {}) { if (is_group_generating || is_send_press) { toastr.error(t`Cannot import characters while generating. Stop the request and try again.`, t`Import aborted`); throw new Error('Cannot import character while generating'); @@ -10830,12 +10830,12 @@ jQuery(async function () { const avatarFileNames = []; for (const file of e.target.files) { const avatarFileName = await importCharacter(file); - if (avatarFileName !== undefined){ + if (avatarFileName !== undefined) { avatarFileNames.push(avatarFileName); } } - if (avatarFileNames.length > 0){ + if (avatarFileNames.length > 0) { await importCharactersTags(avatarFileNames); selectImportedChar(avatarFileNames[avatarFileNames.length - 1]); }