mirror of
https://github.com/rowyio/rowy.git
synced 2026-02-24 04:01:17 +01:00
compressedthumbnail update
This commit is contained in:
@@ -2,18 +2,14 @@ import * as functions from "firebase-functions";
|
||||
// tslint:disable-next-line: no-import-side-effect
|
||||
import "../config";
|
||||
import * as admin from "firebase-admin";
|
||||
|
||||
import * as path from "path";
|
||||
import * as os from "os";
|
||||
import * as fs from "fs";
|
||||
|
||||
import * as sharp from "sharp";
|
||||
import * as imagemin from "imagemin";
|
||||
import * as imageminMozjpeg from "imagemin-mozjpeg";
|
||||
import imageminPngquant from "imagemin-pngquant";
|
||||
|
||||
import config_ from "../functionConfig";
|
||||
|
||||
const SUPPORTED_TYPES = ["image/jpeg", "image/png"];
|
||||
const DEFAULT_SIZES = ["400x400", "200x200", "100x100"];
|
||||
const config: any = config_;
|
||||
@@ -27,29 +23,25 @@ const excludePaths =
|
||||
typeof config.excludes[0] === "string"
|
||||
? config.excludes
|
||||
: [];
|
||||
|
||||
export const FT_compressedThumbnail = functions.storage
|
||||
.object()
|
||||
.onFinalize(async (object) => {
|
||||
// Log file name, size, and content type for monitoring
|
||||
console.log(object.name, object.size, object.contentType);
|
||||
|
||||
// Exit if this is triggered on a file that is not an image.
|
||||
if (!object.contentType || !SUPPORTED_TYPES.includes(object.contentType)) {
|
||||
console.log("Unsupported type", object.contentType);
|
||||
return null;
|
||||
}
|
||||
|
||||
// Exit if this is already a compressed thumbnail.
|
||||
if (object.metadata?.resizedImage) {
|
||||
console.log("This is already a compressed thumbnail", object.name);
|
||||
return null;
|
||||
}
|
||||
|
||||
// Get Firebase Storage download token
|
||||
const token = object.metadata?.firebaseStorageDownloadTokens;
|
||||
|
||||
const filePath = object.name!;
|
||||
const filePath: string = object.name!;
|
||||
|
||||
// Check if file should be excluded based off path
|
||||
for (const excludePath of excludePaths)
|
||||
@@ -57,17 +49,14 @@ export const FT_compressedThumbnail = functions.storage
|
||||
console.log("File excluded from path", excludePath);
|
||||
return null;
|
||||
}
|
||||
|
||||
const baseFileName = path.basename(filePath, path.extname(filePath));
|
||||
const tempLocalFile = path.join(
|
||||
os.tmpdir(),
|
||||
baseFileName + path.extname(filePath)
|
||||
);
|
||||
|
||||
// Download file from bucket.
|
||||
const bucket = admin.storage().bucket(object.bucket);
|
||||
await bucket.file(filePath).download({ destination: tempLocalFile });
|
||||
|
||||
for (const size of sizes) {
|
||||
try {
|
||||
const thumbFilePath = path.normalize(
|
||||
@@ -81,9 +70,9 @@ export const FT_compressedThumbnail = functions.storage
|
||||
os.tmpdir(),
|
||||
path.basename(thumbFilePath)
|
||||
);
|
||||
|
||||
// Resize image to thumbnail size
|
||||
const resized = await sharp(tempLocalFile)
|
||||
.rotate()
|
||||
.resize(
|
||||
parseInt(size.split("x")[0], 10),
|
||||
parseInt(size.split("x")[1], 10),
|
||||
@@ -93,7 +82,6 @@ export const FT_compressedThumbnail = functions.storage
|
||||
}
|
||||
)
|
||||
.toBuffer();
|
||||
|
||||
// Compress the image
|
||||
const compressed = await imagemin.buffer(resized, {
|
||||
plugins: [
|
||||
@@ -102,7 +90,6 @@ export const FT_compressedThumbnail = functions.storage
|
||||
],
|
||||
});
|
||||
fs.writeFileSync(tempLocalThumbFile, compressed);
|
||||
|
||||
// Upload the image
|
||||
await bucket.upload(tempLocalThumbFile, {
|
||||
destination: thumbFilePath,
|
||||
@@ -115,15 +102,12 @@ export const FT_compressedThumbnail = functions.storage
|
||||
},
|
||||
});
|
||||
console.log(size, "thumbnail uploaded to Storage at", thumbFilePath);
|
||||
|
||||
// Once the image has been converted delete the local files to free up disk space.
|
||||
fs.unlinkSync(tempLocalThumbFile);
|
||||
} catch (e) {
|
||||
console.error(`Failed to generate thumbnail size: ${size}`, e);
|
||||
}
|
||||
}
|
||||
|
||||
fs.unlinkSync(tempLocalFile);
|
||||
|
||||
return filePath;
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user