simple-picture-gallery/picture-gallery-server/src/thumbnails.ts

49 lines
1.4 KiB
TypeScript

import sharp from "sharp";
import fs from "fs";
import path from "path";
import { publicPath, thumbnailPath, thumbnailPublicPath } from "./paths";
const percentage = 25;
const minimumPixelForThumbnail = 1000;
export const createThumbnailAsyncForImage = (image: string) => {
sharp(`${publicPath}${image}`)
.metadata()
.then((info) => {
let width = Math.round((info.width * percentage) / 100);
let height = Math.round((info.height * percentage) / 100);
// no thumbnail if both sides are smaller than minimumPixelForThumbnail
if (
info.width <= minimumPixelForThumbnail &&
info.height <= minimumPixelForThumbnail
) {
width = info.width;
height = info.height;
}
fs.mkdir(
thumbnailPublicPath + path.dirname(image),
{ recursive: true },
() => {
sharp(`${publicPath}${image}`)
.resize(width, height)
.toFile(`${thumbnailPublicPath}${image}`);
}
);
});
};
export const initThumbnailsAsync = (dirPath: string) => {
if (dirPath.includes(thumbnailPath)) {
return;
}
const dirEnts = fs.readdirSync(publicPath + dirPath, { withFileTypes: true });
dirEnts
.filter((f) => f.isFile())
.map((f) => createThumbnailAsyncForImage(`${dirPath}/${f.name}`));
dirEnts
.filter((f) => f.isDirectory())
.forEach((d) => initThumbnailsAsync(`${dirPath}/${d.name}`));
};