Add new gallery variant
This commit is contained in:
@ -8,7 +8,10 @@ import sharp from "sharp";
|
||||
import { v4 as uuidv4 } from "uuid";
|
||||
import { generateArtworkColorsForArtwork } from "../artworks/generateArtworkColors";
|
||||
|
||||
export async function createImageFromFile(imageFile: File, opts?: { originalName?: string, colorMode?: "inline" | "defer" | "off" }) {
|
||||
export async function createImageFromFile(
|
||||
imageFile: File,
|
||||
opts?: { originalName?: string; colorMode?: "inline" | "defer" | "off" },
|
||||
) {
|
||||
if (!(imageFile instanceof File)) {
|
||||
console.log("No image or invalid type");
|
||||
return null;
|
||||
@ -29,6 +32,7 @@ export async function createImageFromFile(imageFile: File, opts?: { originalName
|
||||
const modifiedKey = `modified/${fileKey}.webp`;
|
||||
const resizedKey = `resized/${fileKey}.webp`;
|
||||
const thumbnailKey = `thumbnail/${fileKey}.webp`;
|
||||
const galleryKey = `gallery/${fileKey}.webp`;
|
||||
|
||||
const sharpData = sharp(buffer);
|
||||
const metadata = await sharpData.metadata();
|
||||
@ -40,7 +44,7 @@ export async function createImageFromFile(imageFile: File, opts?: { originalName
|
||||
Key: originalKey,
|
||||
Body: buffer,
|
||||
ContentType: "image/" + metadata.format,
|
||||
})
|
||||
}),
|
||||
);
|
||||
|
||||
//--- Modified file
|
||||
@ -53,7 +57,7 @@ export async function createImageFromFile(imageFile: File, opts?: { originalName
|
||||
Key: modifiedKey,
|
||||
Body: modifiedBuffer,
|
||||
ContentType: "image/" + modifiedMetadata.format,
|
||||
})
|
||||
}),
|
||||
);
|
||||
|
||||
//--- Resized file
|
||||
@ -62,7 +66,8 @@ export async function createImageFromFile(imageFile: File, opts?: { originalName
|
||||
|
||||
let resizeOptions: { width?: number; height?: number };
|
||||
if (width && height) {
|
||||
resizeOptions = height < width ? { height: targetSize } : { width: targetSize };
|
||||
resizeOptions =
|
||||
height < width ? { height: targetSize } : { width: targetSize };
|
||||
} else {
|
||||
resizeOptions = { height: targetSize };
|
||||
}
|
||||
@ -80,7 +85,7 @@ export async function createImageFromFile(imageFile: File, opts?: { originalName
|
||||
Key: resizedKey,
|
||||
Body: resizedBuffer,
|
||||
ContentType: "image/" + resizedMetadata.format,
|
||||
})
|
||||
}),
|
||||
);
|
||||
|
||||
//--- Thumbnail file
|
||||
@ -88,7 +93,10 @@ export async function createImageFromFile(imageFile: File, opts?: { originalName
|
||||
|
||||
let thumbnailOptions: { width?: number; height?: number };
|
||||
if (width && height) {
|
||||
thumbnailOptions = height < width ? { height: thumbnailTargetSize } : { width: thumbnailTargetSize };
|
||||
thumbnailOptions =
|
||||
height < width
|
||||
? { height: thumbnailTargetSize }
|
||||
: { width: thumbnailTargetSize };
|
||||
} else {
|
||||
thumbnailOptions = { height: thumbnailTargetSize };
|
||||
}
|
||||
@ -106,7 +114,36 @@ export async function createImageFromFile(imageFile: File, opts?: { originalName
|
||||
Key: thumbnailKey,
|
||||
Body: thumbnailBuffer,
|
||||
ContentType: "image/" + thumbnailMetadata.format,
|
||||
})
|
||||
}),
|
||||
);
|
||||
|
||||
//--- Gallery file
|
||||
const galleryTargetSize = 300;
|
||||
|
||||
let galleryOptions: { width?: number; height?: number };
|
||||
if (width && height) {
|
||||
galleryOptions =
|
||||
height < width
|
||||
? { height: galleryTargetSize }
|
||||
: { width: galleryTargetSize };
|
||||
} else {
|
||||
galleryOptions = { height: galleryTargetSize };
|
||||
}
|
||||
|
||||
const galleryBuffer = await sharp(modifiedBuffer)
|
||||
.resize({ ...galleryOptions, withoutEnlargement: true })
|
||||
.toFormat("webp")
|
||||
.toBuffer();
|
||||
|
||||
const galleryMetadata = await sharp(galleryBuffer).metadata();
|
||||
|
||||
await s3.send(
|
||||
new PutObjectCommand({
|
||||
Bucket: `${process.env.BUCKET_NAME}`,
|
||||
Key: galleryKey,
|
||||
Body: galleryBuffer,
|
||||
ContentType: "image/" + galleryMetadata.format,
|
||||
}),
|
||||
);
|
||||
|
||||
const fileRecord = await prisma.fileData.create({
|
||||
@ -193,6 +230,16 @@ export async function createImageFromFile(imageFile: File, opts?: { originalName
|
||||
sizeBytes: thumbnailMetadata.size,
|
||||
artworkId: artworkRecord.id,
|
||||
},
|
||||
{
|
||||
s3Key: galleryKey,
|
||||
type: "gallery",
|
||||
height: galleryMetadata.height ?? 0,
|
||||
width: galleryMetadata.width ?? 0,
|
||||
fileExtension: galleryMetadata.format,
|
||||
mimeType: "image/" + galleryMetadata.format,
|
||||
sizeBytes: galleryMetadata.size,
|
||||
artworkId: artworkRecord.id,
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
@ -206,6 +253,5 @@ export async function createImageFromFile(imageFile: File, opts?: { originalName
|
||||
// (nothing else to do here)
|
||||
}
|
||||
|
||||
|
||||
return artworkRecord;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user