feat(gacha)!: render /api/gacha as the pack-cards wish

/api/gacha now renders the 6-second portrait pack-cards opening that was
served on /api/gachabeta. The Remotion meteor wish, its timeline, and the
beta route are removed, and the pack-cards renderer and page take the plain
gacha names.

BREAKING CHANGE: /api/gachabeta is gone, and /api/gacha returns a 6-second
portrait video (360x640 for width 640, 480x854 for width 854) instead of the
7-second landscape one.
This commit is contained in:
tiennm99 committed 2026-10-01 22:12:25 +07:00
1 parent d657c49c83
commit 7ca1468a43
18 files changed
+451 -1649

No files matched your search

+1 -16
View File
@@ -52,7 +52,7 @@ try {
headers: {
authorization: 'Bearer smoke-token',
},
payload: {label: 'Pizza', rarity: 5},
payload: {label: 'Bún bò', rarity: 5},
});
if (gacha.statusCode !== 200) {
@@ -65,21 +65,6 @@ try {
}
console.log(`api-smoke gacha: ${gacha.rawPayload.byteLength} bytes`);
const beta = await app.inject({
method: 'POST',
url: '/api/gachabeta',
headers: {
authorization: 'Bearer smoke-token',
},
payload: {label: 'Bún bò', rarity: 5},
});
if (beta.statusCode !== 200 || beta.rawPayload.subarray(4, 8).toString() !== 'ftyp') {
throw new Error(`Expected gachabeta MP4, got ${beta.statusCode}: ${beta.body.slice(0, 200)}`);
}
console.log(`api-smoke gachabeta: ${beta.rawPayload.byteLength} bytes`);
} finally {
await app.close();
}
+7 -17
View File
@@ -1,7 +1,6 @@
import {mkdir, writeFile} from 'node:fs/promises';
import path from 'node:path';
import {closeGachaBetaBrowser, renderGachaBetaVideo} from '../src/render/render-gacha-beta.js';
import {renderGachaVideo} from '../src/render/render-gacha.js';
import {closeGachaBrowser, renderGachaVideo} from '../src/render/render-gacha.js';
import {renderWheelGif} from '../src/render/render-gif.js';
const smoke = process.argv.includes('--smoke');
@@ -51,8 +50,8 @@ await mkdir(fixturesDir, {recursive: true});
/** @type {{name: string, request: import('../src/schemas/gacha-request.js').GachaRenderRequest}[]} */
const gachaFixtures = [
{name: 'gacha-5-star', request: {label: 'Pizza', rarity: 5, fps: 24, width: 640, seed: 7}},
{name: 'gacha-4-star', request: {label: 'Phở bò tái nạm gầu', rarity: 4, fps: 24, width: 640, seed: 11}},
{name: 'gacha-5-star', request: {label: 'Bún bò', rarity: 5, fps: 24, width: 640, seed: 7}},
{name: 'gacha-4-star', request: {label: 'Phở bò tái chín', rarity: 4, fps: 24, width: 640, seed: 11}},
{name: 'gacha-3-star', request: {label: 'Cơm tấm', rarity: 3, fps: 24, width: 854, seed: 23}},
];
@@ -70,19 +69,10 @@ for (const fixture of smoke ? fixtures.slice(0, 1) : fixtures) {
await save(`${fixture.name}.gif`, await renderWheelGif(fixture.request, {timeoutInMilliseconds: 30000}));
}
for (const fixture of smoke ? gachaFixtures.slice(0, 1) : gachaFixtures) {
await save(`${fixture.name}.mp4`, await renderGachaVideo(fixture.request, {timeoutInMilliseconds: 30000}));
}
const betaFixture = {
label: 'Bún bò',
rarity: /** @type {const} */ (5),
fps: /** @type {const} */ (24),
width: /** @type {const} */ (640),
seed: 7,
};
try {
await save('gachabeta-5-star.mp4', await renderGachaBetaVideo(betaFixture, {timeoutInMilliseconds: 60000}));
for (const fixture of smoke ? gachaFixtures.slice(0, 1) : gachaFixtures) {
await save(`${fixture.name}.mp4`, await renderGachaVideo(fixture.request, {timeoutInMilliseconds: 60000}));
}
} finally {
await closeGachaBetaBrowser();
await closeGachaBrowser();
}