Use shared constant for default avatar path

b3077c463538fbbc542bb279baced49cc7f27021

Cohee <18619528+Cohee1207@users.noreply.github.com>

3 files changed, +11 -10Ignore whitespace
src/constants.js+1 -0
@@ -328,6 +328,7 @@ export const OPENAI_KEYS = [
328328
329329export const AVATAR_WIDTH = 512;
330330export const AVATAR_HEIGHT = 768;
331+export const DEFAULT_AVATAR_PATH = './public/img/ai4.png';
331332
332333export const OPENROUTER_HEADERS = {
333334 'HTTP-Referer': 'https://sillytavern.app',
src/endpoints/characters.js+8 -9
@@ -12,7 +12,7 @@ import mime from 'mime-types';
1212import { Jimp, JimpMime } from '../jimp.js';
1313import storage from 'node-persist';
1414
1515import { AVATAR_WIDTH, AVATAR_HEIGHT, DEFAULT_AVATAR_PATH } from '../constants.js';
1616import { default as validateAvatarUrlMiddleware, getFileNameValidationFunction } from '../middleware/validateFileName.js';
1717import { deepMerge, humanizedISO8601DateTime, tryParse, extractFileFromZipBuffer, MemoryLimitedMap, getConfigValue, mutateJsonString } from '../util.js';
1818import { TavernCardValidator } from '../validator/TavernCardValidator.js';
@@ -22,7 +22,6 @@ import { invalidateThumbnail } from './thumbnails.js';
2222import { importRisuSprites } from './sprites.js';
2323import { getUserDirectories } from '../users.js';
2424import { getChatInfo } from './chats.js';
25-const defaultAvatarPath = './public/img/ai4.png';
2625
2726// With 100 MB limit it would take roughly 3000 characters to reach this limit
2827const memoryCacheCapacity = getConfigValue('performance.memoryCacheCapacity', '100mb');
@@ -243,7 +242,7 @@ async function writeCharacterData(inputFile, data, outputFile, request, crop = u
243242 } catch (error) {
244243 const message = Buffer.isBuffer(inputFile) ? 'Failed to read image buffer.' : `Failed to read image: ${inputFile}.`;
245244 console.warn(message, 'Using a fallback image.', error);
246245 return await fs.promises.readFile(defaultAvatarPathDEFAULT_AVATAR_PATH);
247246 }
248247 }
249248
@@ -746,7 +745,7 @@ async function importFromYaml(uploadPath, context, preservedFileName) {
746745 'creator': '',
747746 'tags': '',
748747 }, context.request.user.directories);
749748 const result = await writeCharacterData(defaultAvatarPathDEFAULT_AVATAR_PATH, JSON.stringify(char), fileName, context.request);
750749 return result ? fileName : '';
751750}
752751
@@ -775,7 +774,7 @@ async function importFromCharX(uploadPath, { request }, preservedFileName) {
775774 }
776775
777776 /** @type {string|Buffer} */
778777 let avatar = defaultAvatarPathDEFAULT_AVATAR_PATH;
779778 const assets = _.get(card, 'data.assets');
780779 if (Array.isArray(assets) && assets.length) {
781780 for (const asset of assets.filter(x => x.type === 'icon' && typeof x.uri === 'string')) {
@@ -817,7 +816,7 @@ async function importFromJson(uploadPath, { request }, preservedFileName) {
817816 jsonData['create_date'] = humanizedISO8601DateTime();
818817 const pngName = preservedFileName || getPngName(jsonData.data?.name || jsonData.name, request.user.directories);
819818 const char = JSON.stringify(jsonData);
820819 const result = await writeCharacterData(defaultAvatarPathDEFAULT_AVATAR_PATH, char, pngName, request);
821820 return result ? pngName : '';
822821 } else if (jsonData.name !== undefined) {
823822 console.info('Importing from v1 json');
@@ -843,7 +842,7 @@ async function importFromJson(uploadPath, { request }, preservedFileName) {
843842 };
844843 char = convertToV2(char, request.user.directories);
845844 let charJSON = JSON.stringify(char);
846845 const result = await writeCharacterData(defaultAvatarPathDEFAULT_AVATAR_PATH, charJSON, pngName, request);
847846 return result ? pngName : '';
848847 } else if (jsonData.char_name !== undefined) {//json Pygmalion notepad
849848 console.info('Importing from gradio json');
@@ -869,7 +868,7 @@ async function importFromJson(uploadPath, { request }, preservedFileName) {
869868 };
870869 char = convertToV2(char, request.user.directories);
871870 const charJSON = JSON.stringify(char);
872871 const result = await writeCharacterData(defaultAvatarPathDEFAULT_AVATAR_PATH, charJSON, pngName, request);
873872 return result ? pngName : '';
874873 }
875874
@@ -950,7 +949,7 @@ router.post('/create', async function (request, response) {
950949 if (!fs.existsSync(chatsPath)) fs.mkdirSync(chatsPath);
951950
952951 if (!request.file) {
953952 await writeCharacterData(defaultAvatarPathDEFAULT_AVATAR_PATH, char, internalName, request);
954953 return response.send(avatarName);
955954 } else {
956955 const crop = tryParse(request.query.crop);
src/endpoints/content-manager.js+2 -1
@@ -10,6 +10,7 @@ import { sync as writeFileAtomicSync } from 'write-file-atomic';
1010import { getConfigValue, color, setPermissionsSync } from '../util.js';
1111import { write } from '../character-card-parser.js';
1212import { serverDirectory } from '../server-directory.js';
13+import { DEFAULT_AVATAR_PATH } from '../constants.js';
1314
1415const contentDirectory = path.join(serverDirectory, 'default/content');
1516const scaffoldDirectory = path.join(serverDirectory, 'default/scaffold');
@@ -711,7 +712,7 @@ async function downloadSoulkynCharacter(slug) {
711712
712713 // Fallback to default avatar
713714 if (!avatarBuffer) {
714715 const defaultAvatarPath = path.join(serverDirectory, 'public', 'img', 'ai4.png'DEFAULT_AVATAR_PATH);
715716 avatarBuffer = fs.readFileSync(defaultAvatarPath);
716717 }
717718