From 54e28d361f535a2180ea45d89ebc70490d47fb56 Mon Sep 17 00:00:00 2001 From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com> Date: Wed, 23 Aug 2023 22:59:05 -0400 Subject: [PATCH] fix: don't die on missing optional dependency gifencoder --- source/app/metrics/utils.mjs | 44 ++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/source/app/metrics/utils.mjs b/source/app/metrics/utils.mjs index 6a10bd0a..29ae610d 100644 --- a/source/app/metrics/utils.mjs +++ b/source/app/metrics/utils.mjs @@ -764,26 +764,32 @@ export async function gif({page, width, height, frames, x = 0, y = 0, repeat = t if (fss.existsSync(path)) await fs.unlink(path) //Create encoder - const GIFEncoder = (await import("gifencoder")).default - const encoder = new GIFEncoder(width, height) - encoder.createWriteStream().pipe(fss.createWriteStream(path)) - encoder.start() - encoder.setRepeat(repeat ? 0 : -1) - encoder.setDelay(delay) - encoder.setQuality(quality) - //Register frames - for (let i = 0; i < frames; i++) { - const buffer = new PNG(await page.screenshot({clip: {width, height, x, y}})) - encoder.addFrame(await new Promise(solve => buffer.decode(pixels => solve(pixels)))) - if (frames % 10 === 0) - console.debug(`metrics/puppeteergif > processed ${i}/${frames} frames`) + try { + const GIFEncoder = (await import("gifencoder")).default + const encoder = new GIFEncoder(width, height) + encoder.createWriteStream().pipe(fss.createWriteStream(path)) + encoder.start() + encoder.setRepeat(repeat ? 0 : -1) + encoder.setDelay(delay) + encoder.setQuality(quality) + //Register frames + for (let i = 0; i < frames; i++) { + const buffer = new PNG(await page.screenshot({clip: {width, height, x, y}})) + encoder.addFrame(await new Promise(solve => buffer.decode(pixels => solve(pixels)))) + if (frames % 10 === 0) + console.debug(`metrics/puppeteergif > processed ${i}/${frames} frames`) + } + console.debug(`metrics/puppeteergif > processed ${frames}/${frames} frames`) + //Close encoder and convert to base64 + encoder.finish() + const result = await fs.readFile(path, "base64") + await fs.unlink(path) + return `data:image/gif;base64,${result}` + } + catch (error) { + console.debug(`metrics/puppeteergif > could not create gif: ${error}`) + return "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mOcOnfpfwAGfgLYttYINwAAAABJRU5ErkJggg==" } - console.debug(`metrics/puppeteergif > processed ${frames}/${frames} frames`) - //Close encoder and convert to base64 - encoder.finish() - const result = await fs.readFile(path, "base64") - await fs.unlink(path) - return `data:image/gif;base64,${result}` } /**D3 node wrapper (loosely based on https://github.com/d3-node/d3-node)*/