portfolio-website/scripts/create-thumbnails.js

84 lines
2.6 KiB
JavaScript

import sharp from 'sharp';
import { readdir, stat } from 'fs/promises';
import { join, extname, dirname, basename } from 'path';
import { fileURLToPath } from 'url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const publicDir = join(__dirname, '..', 'public', 'images');
// Liste des images utilisées dans les cartes projet (miniatures)
const thumbnailImages = [
'projects/homemade_nas.webp',
'projects/pong.webp',
'projects/cloud_1.webp',
'projects/minishell.webp',
'projects/cub3d.webp',
'sites/avopieces/mookup/3-devices-white (1).webp',
'sites/etsidemain/mookup/3-devices-white.webp'
];
async function createThumbnail(filePath, size = 128) {
const ext = extname(filePath);
const dir = dirname(filePath);
const name = basename(filePath, ext);
const thumbnailPath = join(dir, `${name}_thumb${ext}`);
try {
const stats = await stat(filePath);
const originalSize = stats.size;
// Créer une miniature carrée de 128x128
await sharp(filePath)
.resize(size, size, {
fit: 'cover',
position: 'center'
})
.webp({
quality: 85,
effort: 6
})
.toFile(thumbnailPath);
const newStats = await stat(thumbnailPath);
const newSize = newStats.size;
const reduction = ((originalSize - newSize) / originalSize * 100).toFixed(2);
console.log(`${basename(filePath)}`);
console.log(` Original: ${(originalSize / 1024).toFixed(2)} KB`);
console.log(` Miniature: ${(newSize / 1024).toFixed(2)} KB`);
console.log(` Réduction: ${reduction}%\n`);
return { originalSize, newSize };
} catch (error) {
console.error(`❌ Erreur avec ${filePath}:`, error.message);
return { originalSize: 0, newSize: 0 };
}
}
async function main() {
console.log('🖼️ Création des miniatures pour les cartes projet...\n');
let totalOriginal = 0;
let totalNew = 0;
for (const imagePath of thumbnailImages) {
const fullPath = join(publicDir, imagePath);
const { originalSize, newSize } = await createThumbnail(fullPath);
totalOriginal += originalSize;
totalNew += newSize;
}
const totalReduction = ((totalOriginal - totalNew) / totalOriginal * 100).toFixed(2);
console.log('=' .repeat(50));
console.log(`📊 RÉSUMÉ DES MINIATURES:`);
console.log(` Taille originale: ${(totalOriginal / 1024).toFixed(2)} KB`);
console.log(` Taille miniatures: ${(totalNew / 1024).toFixed(2)} KB`);
console.log(` Économie totale: ${totalReduction}%`);
console.log(` ${(totalOriginal - totalNew) / 1024} KB économisés! 🎉`);
}
main().catch(console.error);