From 40f16b98e2fe6303a5d98f7348b6f3565f13e9df Mon Sep 17 00:00:00 2001 From: Fedor Indutny <79877362+indutny-signal@users.noreply.github.com> Date: Mon, 25 Apr 2022 13:56:59 -0700 Subject: [PATCH] Transcode link preview images --- ts/linkPreviews/linkPreviewFetch.ts | 17 ++++++++++ .../linkPreviews/linkPreviewFetch_test.ts | 34 +++++++++---------- 2 files changed, 33 insertions(+), 18 deletions(-) diff --git a/ts/linkPreviews/linkPreviewFetch.ts b/ts/linkPreviews/linkPreviewFetch.ts index 2c07ec255..98942f983 100644 --- a/ts/linkPreviews/linkPreviewFetch.ts +++ b/ts/linkPreviews/linkPreviewFetch.ts @@ -3,6 +3,7 @@ import type { RequestInit, Response } from 'node-fetch'; import type { AbortSignal as AbortSignalForNodeFetch } from 'abort-controller'; +import { blobToArrayBuffer } from 'blob-util'; import type { MIMEType } from '../types/MIME'; import { @@ -14,6 +15,7 @@ import { stringToMIMEType, } from '../types/MIME'; import type { LoggerType } from '../types/Logging'; +import { scaleImageToLevel } from '../util/scaleImageToLevel'; import * as log from '../logging/log'; const USER_AGENT = 'WhatsApp/2'; @@ -603,5 +605,20 @@ export async function fetchLinkPreviewImage( return null; } + // Scale link preview image + if (contentType !== IMAGE_GIF) { + const dataBlob = new Blob([data], { + type: contentType, + }); + const { blob: xcodedDataBlob } = await scaleImageToLevel( + dataBlob, + contentType, + false + ); + const xcodedDataArrayBuffer = await blobToArrayBuffer(xcodedDataBlob); + + data = new Uint8Array(xcodedDataArrayBuffer); + } + return { data, contentType }; } diff --git a/ts/test-electron/linkPreviews/linkPreviewFetch_test.ts b/ts/test-electron/linkPreviews/linkPreviewFetch_test.ts index 563e9418b..8681f9407 100644 --- a/ts/test-electron/linkPreviews/linkPreviewFetch_test.ts +++ b/ts/test-electron/linkPreviews/linkPreviewFetch_test.ts @@ -1151,15 +1151,14 @@ describe('link preview fetching', () => { ); assert.deepEqual( - await fetchLinkPreviewImage( - fakeFetch, - 'https://example.com/img', - new AbortController().signal - ), - { - data: fixture, - contentType: stringToMIMEType(contentType), - } + ( + await fetchLinkPreviewImage( + fakeFetch, + 'https://example.com/img', + new AbortController().signal + ) + )?.contentType, + stringToMIMEType(contentType) ); }); }); @@ -1238,15 +1237,14 @@ describe('link preview fetching', () => { ); assert.deepEqual( - await fetchLinkPreviewImage( - fakeFetch, - 'https://example.com/img', - new AbortController().signal - ), - { - data: fixture, - contentType: IMAGE_JPEG, - } + ( + await fetchLinkPreviewImage( + fakeFetch, + 'https://example.com/img', + new AbortController().signal + ) + )?.contentType, + IMAGE_JPEG ); sinon.assert.calledTwice(fakeFetch);