From 83ef118c37d41cbd470e1000eef91ed8c6d4f441 Mon Sep 17 00:00:00 2001 From: Mateus Werneck Date: Sun, 3 May 2026 02:17:54 -0300 Subject: [PATCH 1/3] fix: update mii renderer filenames and resolutions to match NNS face expression filenames renamed to match the original Nintendo Network naming convention (e.g. smile_open_mouth -> happy_face, sorrow -> puzzled_face, etc.). face render resolution changed from 128x128 to 96x96, and whole body resolution changed from 270x270 to 270x360. --- src/models/pnid.ts | 19 +++++++++++++------ src/services/nnas/routes/miis.ts | 26 +++++++++++++------------- src/types/mii-js.d.ts | 1 + 3 files changed, 27 insertions(+), 19 deletions(-) diff --git a/src/models/pnid.ts b/src/models/pnid.ts index bca37bb..06acfad 100644 --- a/src/models/pnid.ts +++ b/src/models/pnid.ts @@ -202,7 +202,7 @@ PNIDSchema.method('generateMiiImages', async function generateMiiImages(): Promi const mii = new Mii(Buffer.from(miiData, 'base64')); const miiStudioUrl = mii.studioUrl({ type: 'face', - width: 128, + width: 96, instanceCount: 1 }); const miiStudioNormalFaceImageData = await got(miiStudioUrl).buffer(); @@ -214,25 +214,32 @@ PNIDSchema.method('generateMiiImages', async function generateMiiImages(): Promi await uploadCDNAsset(config.s3.bucket, `${userMiiKey}/standard.tga`, tga, 'public-read'); await uploadCDNAsset(config.s3.bucket, `${userMiiKey}/normal_face.png`, miiStudioNormalFaceImageData, 'public-read'); - const expressions = ['frustrated', 'smile_open_mouth', 'wink_left', 'sorrow', 'surprise_open_mouth']; - for (const expression of expressions) { + const expressions: { expression: string; filename: string }[] = [ + { expression: 'frustrated', filename: 'frustrated_face' }, + { expression: 'smile_open_mouth', filename: 'happy_face' }, + { expression: 'wink_left', filename: 'like_face' }, + { expression: 'sorrow', filename: 'puzzled_face' }, + { expression: 'surprise_open_mouth', filename: 'surprised_face' } + ]; + for (const { expression, filename } of expressions) { const miiStudioExpressionUrl = mii.studioUrl({ type: 'face', expression: expression, - width: 128, + width: 96, instanceCount: 1 }); const miiStudioExpressionImageData = await got(miiStudioExpressionUrl).buffer(); - await uploadCDNAsset(config.s3.bucket, `${userMiiKey}/${expression}.png`, miiStudioExpressionImageData, 'public-read'); + await uploadCDNAsset(config.s3.bucket, `${userMiiKey}/${filename}.png`, miiStudioExpressionImageData, 'public-read'); } const miiStudioBodyUrl = mii.studioUrl({ type: 'all_body', width: 270, + height: 360, instanceCount: 1 }); const miiStudioBodyImageData = await got(miiStudioBodyUrl).buffer(); - await uploadCDNAsset(config.s3.bucket, `${userMiiKey}/body.png`, miiStudioBodyImageData, 'public-read'); + await uploadCDNAsset(config.s3.bucket, `${userMiiKey}/whole_body.png`, miiStudioBodyImageData, 'public-read'); }); PNIDSchema.method('markForDeletion', function markForDeletion() { diff --git a/src/services/nnas/routes/miis.ts b/src/services/nnas/routes/miis.ts index c128658..9850e3f 100644 --- a/src/services/nnas/routes/miis.ts +++ b/src/services/nnas/routes/miis.ts @@ -65,21 +65,21 @@ router.get('/', async (request: express.Request, response: express.Response): Pr type: 'standard' }, { - cached_url: `${config.cdn.base_url}/mii/${pnid.pid}/frustrated.png`, + cached_url: `${config.cdn.base_url}/mii/${pnid.pid}/frustrated_face.png`, id: pnid.mii.id, - url: `${config.cdn.base_url}/mii/${pnid.pid}/frustrated.png`, + url: `${config.cdn.base_url}/mii/${pnid.pid}/frustrated_face.png`, type: 'frustrated_face' }, { - cached_url: `${config.cdn.base_url}/mii/${pnid.pid}/smile_open_mouth.png`, + cached_url: `${config.cdn.base_url}/mii/${pnid.pid}/happy_face.png`, id: pnid.mii.id, - url: `${config.cdn.base_url}/mii/${pnid.pid}/smile_open_mouth.png`, + url: `${config.cdn.base_url}/mii/${pnid.pid}/happy_face.png`, type: 'happy_face' }, { - cached_url: `${config.cdn.base_url}/mii/${pnid.pid}/wink_left.png`, + cached_url: `${config.cdn.base_url}/mii/${pnid.pid}/like_face.png`, id: pnid.mii.id, - url: `${config.cdn.base_url}/mii/${pnid.pid}/wink_left.png`, + url: `${config.cdn.base_url}/mii/${pnid.pid}/like_face.png`, type: 'like_face' }, { @@ -89,21 +89,21 @@ router.get('/', async (request: express.Request, response: express.Response): Pr type: 'normal_face' }, { - cached_url: `${config.cdn.base_url}/mii/${pnid.pid}/sorrow.png`, + cached_url: `${config.cdn.base_url}/mii/${pnid.pid}/puzzled_face.png`, id: pnid.mii.id, - url: `${config.cdn.base_url}/mii/${pnid.pid}/sorrow.png`, + url: `${config.cdn.base_url}/mii/${pnid.pid}/puzzled_face.png`, type: 'puzzled_face' }, { - cached_url: `${config.cdn.base_url}/mii/${pnid.pid}/surprised_open_mouth.png`, + cached_url: `${config.cdn.base_url}/mii/${pnid.pid}/surprised_face.png`, id: pnid.mii.id, - url: `${config.cdn.base_url}/mii/${pnid.pid}/surprised_open_mouth.png`, + url: `${config.cdn.base_url}/mii/${pnid.pid}/surprised_face.png`, type: 'surprised_face' }, { - cached_url: `${config.cdn.base_url}/mii/${pnid.pid}/body.png`, + cached_url: `${config.cdn.base_url}/mii/${pnid.pid}/whole_body.png`, id: pnid.mii.id, - url: `${config.cdn.base_url}/mii/${pnid.pid}/body.png`, + url: `${config.cdn.base_url}/mii/${pnid.pid}/whole_body.png`, type: 'whole_body' } ] @@ -127,4 +127,4 @@ router.get('/', async (request: express.Request, response: express.Response): Pr } }); -export default router; +export default router; diff --git a/src/types/mii-js.d.ts b/src/types/mii-js.d.ts index 65ffca6..8cd4d32 100644 --- a/src/types/mii-js.d.ts +++ b/src/types/mii-js.d.ts @@ -6,6 +6,7 @@ type MiiStudioURLOptions = { type?: string; expression?: string; width?: number; + height?: number; bgColor?: string; clothesColor?: string; cameraXRotate?: number; From 76672dee820bb366268c982cd54a47dad7495b9f Mon Sep 17 00:00:00 2001 From: Mateus Werneck Date: Mon, 4 May 2026 13:10:03 -0300 Subject: [PATCH 2/3] fix: remove explicit type annotation from expressions array --- src/models/pnid.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/models/pnid.ts b/src/models/pnid.ts index 06acfad..3babef2 100644 --- a/src/models/pnid.ts +++ b/src/models/pnid.ts @@ -214,7 +214,7 @@ PNIDSchema.method('generateMiiImages', async function generateMiiImages(): Promi await uploadCDNAsset(config.s3.bucket, `${userMiiKey}/standard.tga`, tga, 'public-read'); await uploadCDNAsset(config.s3.bucket, `${userMiiKey}/normal_face.png`, miiStudioNormalFaceImageData, 'public-read'); - const expressions: { expression: string; filename: string }[] = [ + const expressions = [ { expression: 'frustrated', filename: 'frustrated_face' }, { expression: 'smile_open_mouth', filename: 'happy_face' }, { expression: 'wink_left', filename: 'like_face' }, From cda56890444932a9d7c52b3d4ceb5da14be9e78d Mon Sep 17 00:00:00 2001 From: Mateus Werneck Date: Tue, 5 May 2026 13:05:50 -0300 Subject: [PATCH 3/3] fix: remove unsupported height parameter from mii studio body render the mii studio api does not support a height parameter, the image is always square based on width. verified by testing the api directly. --- src/models/pnid.ts | 1 - src/types/mii-js.d.ts | 1 - 2 files changed, 2 deletions(-) diff --git a/src/models/pnid.ts b/src/models/pnid.ts index 3babef2..264d0fe 100644 --- a/src/models/pnid.ts +++ b/src/models/pnid.ts @@ -235,7 +235,6 @@ PNIDSchema.method('generateMiiImages', async function generateMiiImages(): Promi const miiStudioBodyUrl = mii.studioUrl({ type: 'all_body', width: 270, - height: 360, instanceCount: 1 }); const miiStudioBodyImageData = await got(miiStudioBodyUrl).buffer(); diff --git a/src/types/mii-js.d.ts b/src/types/mii-js.d.ts index 8cd4d32..65ffca6 100644 --- a/src/types/mii-js.d.ts +++ b/src/types/mii-js.d.ts @@ -6,7 +6,6 @@ type MiiStudioURLOptions = { type?: string; expression?: string; width?: number; - height?: number; bgColor?: string; clothesColor?: string; cameraXRotate?: number;