Files
coins/bin/fetch-textures.ts
T

86 lines
2.8 KiB
TypeScript

import path from 'path';
import Vibrant from 'node-vibrant';
import { NumistaType } from '@/types/numista';
import { asyncSpawn } from './async-spawn';
import puppeteer, { Page } from 'puppeteer';
import { writeFile } from 'fs/promises';
import { getTextureUrl } from '@/core/utils/texture-urls';
const baseDir = './public';
export const downloadFile = async (page: Page, url: string): Promise<[string, string, string?]> => {
const filepath = url.split('catalogue')[1];
const folder = path.join(baseDir, filepath.split('/').slice(0, -1).join('/'));
console.log(url);
await asyncSpawn('mkdir', ['-p', folder]);
const destination = path.join(baseDir, filepath);
const pageRes = await page.goto(url, { waitUntil: 'load' });
if (pageRes) {
await writeFile(destination, await pageRes.buffer());
}
const destinationWebp = destination.replace(/\.\w*$/g, '.webp')
await asyncSpawn('cwebp', [destination, '-o', destinationWebp])
let color: string | undefined;
const palette = await Vibrant.from(destination).getPalette();
if (palette.Vibrant) {
color = 'rgb(' + palette.Vibrant.rgb.join(',') + ')';
}
return [destinationWebp, destination, color];
};
export const fetchTextures = async (type: NumistaType) => {
try {
const browser = await puppeteer.launch({ headless: false });
const page = await browser.newPage();
const texturesToBump: string[] = [];
page.setViewport({ width: 1280, height: 926 });
if (type?.obverse?.picture) {
const [destinationWebp, destination, color] = await downloadFile(page, type.obverse.picture);
type.obverse.picture = destinationWebp.split('public')[1];
texturesToBump.push(`./public${destination.split('public')[1]}`);
if (color) {
type.color = color;
}
}
if (type?.reverse?.picture) {
const [destinationWebp, destination] = await downloadFile(page, type.reverse.picture);
type.reverse.picture = destinationWebp.split('public')[1];
texturesToBump.push(`./public${destination.split('public')[1]}`);
}
if (type?.edge?.picture) {
const [destinationWebp, destination] = await downloadFile(page, type.edge.picture);
type.edge.picture = destinationWebp.split('public')[1];
await asyncSpawn('rm', [`./public${destination.split('public')[1]}`])
}
await browser.close();
const bumpPngs = []
for (const texture of texturesToBump) {
await asyncSpawn('./bin/generate-depth.sh', [texture]);
const bumpTextureWebp = getTextureUrl(texture, 'bump')
const bumpTexturePng = bumpTextureWebp.replace(/(\.[^/.]+)$/, '.png')
bumpPngs.push(bumpTexturePng)
await asyncSpawn('cwebp', [bumpTexturePng, '-o', bumpTextureWebp])
}
await asyncSpawn('rm', [...texturesToBump,...bumpPngs])
return type;
} catch (e) {
console.error(e);
return null;
}
};