Use shared constant for default avatar path
| @@ -328,6 +328,7 @@ export const OPENAI_KEYS = [ | ||
| 328 | 328 | |
| 329 | 329 | export const AVATAR_WIDTH = 512; |
| 330 | 330 | export const AVATAR_HEIGHT = 768; |
| 331 | +export const DEFAULT_AVATAR_PATH = './public/img/ai4.png'; | |
| 331 | 332 | |
| 332 | 333 | export const OPENROUTER_HEADERS = { |
| 333 | 334 | 'HTTP-Referer': 'https://sillytavern.app', |
| @@ -12,7 +12,7 @@ import mime from 'mime-types'; | ||
| 12 | 12 | import { Jimp, JimpMime } from '../jimp.js'; |
| 13 | 13 | import storage from 'node-persist'; |
| 14 | 14 | |
| 15 | 15 | import { AVATAR_WIDTH, AVATAR_HEIGHT, DEFAULT_AVATAR_PATH } from '../constants.js'; |
| 16 | 16 | import { default as validateAvatarUrlMiddleware, getFileNameValidationFunction } from '../middleware/validateFileName.js'; |
| 17 | 17 | import { deepMerge, humanizedISO8601DateTime, tryParse, extractFileFromZipBuffer, MemoryLimitedMap, getConfigValue, mutateJsonString } from '../util.js'; |
| 18 | 18 | import { TavernCardValidator } from '../validator/TavernCardValidator.js'; |
| @@ -22,7 +22,6 @@ import { invalidateThumbnail } from './thumbnails.js'; | ||
| 22 | 22 | import { importRisuSprites } from './sprites.js'; |
| 23 | 23 | import { getUserDirectories } from '../users.js'; |
| 24 | 24 | import { getChatInfo } from './chats.js'; |
| 25 | -const defaultAvatarPath = './public/img/ai4.png'; | |
| 26 | 25 | |
| 27 | 26 | // With 100 MB limit it would take roughly 3000 characters to reach this limit |
| 28 | 27 | const memoryCacheCapacity = getConfigValue('performance.memoryCacheCapacity', '100mb'); |
| @@ -243,7 +242,7 @@ async function writeCharacterData(inputFile, data, outputFile, request, crop = u | ||
| 243 | 242 | } catch (error) { |
| 244 | 243 | const message = Buffer.isBuffer(inputFile) ? 'Failed to read image buffer.' : `Failed to read image: ${inputFile}.`; |
| 245 | 244 | console.warn(message, 'Using a fallback image.', error); |
| 246 | 245 | return await fs.promises.readFile(defaultAvatarPathDEFAULT_AVATAR_PATH); |
| 247 | 246 | } |
| 248 | 247 | } |
| 249 | 248 | |
| @@ -746,7 +745,7 @@ async function importFromYaml(uploadPath, context, preservedFileName) { | ||
| 746 | 745 | 'creator': '', |
| 747 | 746 | 'tags': '', |
| 748 | 747 | }, context.request.user.directories); |
| 749 | 748 | const result = await writeCharacterData(defaultAvatarPathDEFAULT_AVATAR_PATH, JSON.stringify(char), fileName, context.request); |
| 750 | 749 | return result ? fileName : ''; |
| 751 | 750 | } |
| 752 | 751 | |
| @@ -775,7 +774,7 @@ async function importFromCharX(uploadPath, { request }, preservedFileName) { | ||
| 775 | 774 | } |
| 776 | 775 | |
| 777 | 776 | /** @type {string|Buffer} */ |
| 778 | 777 | let avatar = defaultAvatarPathDEFAULT_AVATAR_PATH; |
| 779 | 778 | const assets = _.get(card, 'data.assets'); |
| 780 | 779 | if (Array.isArray(assets) && assets.length) { |
| 781 | 780 | for (const asset of assets.filter(x => x.type === 'icon' && typeof x.uri === 'string')) { |
| @@ -817,7 +816,7 @@ async function importFromJson(uploadPath, { request }, preservedFileName) { | ||
| 817 | 816 | jsonData['create_date'] = humanizedISO8601DateTime(); |
| 818 | 817 | const pngName = preservedFileName || getPngName(jsonData.data?.name || jsonData.name, request.user.directories); |
| 819 | 818 | const char = JSON.stringify(jsonData); |
| 820 | 819 | const result = await writeCharacterData(defaultAvatarPathDEFAULT_AVATAR_PATH, char, pngName, request); |
| 821 | 820 | return result ? pngName : ''; |
| 822 | 821 | } else if (jsonData.name !== undefined) { |
| 823 | 822 | console.info('Importing from v1 json'); |
| @@ -843,7 +842,7 @@ async function importFromJson(uploadPath, { request }, preservedFileName) { | ||
| 843 | 842 | }; |
| 844 | 843 | char = convertToV2(char, request.user.directories); |
| 845 | 844 | let charJSON = JSON.stringify(char); |
| 846 | 845 | const result = await writeCharacterData(defaultAvatarPathDEFAULT_AVATAR_PATH, charJSON, pngName, request); |
| 847 | 846 | return result ? pngName : ''; |
| 848 | 847 | } else if (jsonData.char_name !== undefined) {//json Pygmalion notepad |
| 849 | 848 | console.info('Importing from gradio json'); |
| @@ -869,7 +868,7 @@ async function importFromJson(uploadPath, { request }, preservedFileName) { | ||
| 869 | 868 | }; |
| 870 | 869 | char = convertToV2(char, request.user.directories); |
| 871 | 870 | const charJSON = JSON.stringify(char); |
| 872 | 871 | const result = await writeCharacterData(defaultAvatarPathDEFAULT_AVATAR_PATH, charJSON, pngName, request); |
| 873 | 872 | return result ? pngName : ''; |
| 874 | 873 | } |
| 875 | 874 | |
| @@ -950,7 +949,7 @@ router.post('/create', async function (request, response) { | ||
| 950 | 949 | if (!fs.existsSync(chatsPath)) fs.mkdirSync(chatsPath); |
| 951 | 950 | |
| 952 | 951 | if (!request.file) { |
| 953 | 952 | await writeCharacterData(defaultAvatarPathDEFAULT_AVATAR_PATH, char, internalName, request); |
| 954 | 953 | return response.send(avatarName); |
| 955 | 954 | } else { |
| 956 | 955 | const crop = tryParse(request.query.crop); |
| @@ -10,6 +10,7 @@ import { sync as writeFileAtomicSync } from 'write-file-atomic'; | ||
| 10 | 10 | import { getConfigValue, color, setPermissionsSync } from '../util.js'; |
| 11 | 11 | import { write } from '../character-card-parser.js'; |
| 12 | 12 | import { serverDirectory } from '../server-directory.js'; |
| 13 | +import { DEFAULT_AVATAR_PATH } from '../constants.js'; | |
| 13 | 14 | |
| 14 | 15 | const contentDirectory = path.join(serverDirectory, 'default/content'); |
| 15 | 16 | const scaffoldDirectory = path.join(serverDirectory, 'default/scaffold'); |
| @@ -711,7 +712,7 @@ async function downloadSoulkynCharacter(slug) { | ||
| 711 | 712 | |
| 712 | 713 | // Fallback to default avatar |
| 713 | 714 | if (!avatarBuffer) { |
| 714 | 715 | const defaultAvatarPath = path.join(serverDirectory, 'public', 'img', 'ai4.png'DEFAULT_AVATAR_PATH); |
| 715 | 716 | avatarBuffer = fs.readFileSync(defaultAvatarPath); |
| 716 | 717 | } |
| 717 | 718 | |