diff --git a/src/jobs/incoming.ts b/src/jobs/incoming.ts index b7fe076c..ee91fb1b 100644 --- a/src/jobs/incoming.ts +++ b/src/jobs/incoming.ts @@ -8,6 +8,7 @@ import logger from '../services/logger' import fetch, { Response } from 'node-fetch' import mime from 'mime-types' import { generateUnoId } from '../utils/id' +import { convertToWebpSticker, MAX_STICKER_BYTES } from '../utils/sticker_convert' export class IncomingJob { private incoming: Incoming @@ -65,11 +66,16 @@ export class IncomingJob { const { mediaStore } = await config.getStore(phone, config) const mediaKey = `${phone}/${idUno}` const link = payload[payload.type].link - const mimetype = getMimetype(payload) + let mimetype = getMimetype(payload) const extension = mime.extension(mimetype) const fileName = `${mediaKey}.${extension}` const response: Response = await fetch(link, { signal: AbortSignal.timeout(FETCH_TIMEOUT_MS), method: 'GET' }) - const buffer = toBuffer(await response.arrayBuffer()) + let buffer: Buffer = toBuffer(await response.arrayBuffer()) + if (payload.type === 'sticker' && buffer.byteLength <= MAX_STICKER_BYTES) { + const animated = extension == 'gif' + buffer = await convertToWebpSticker(buffer, { animated }) + mimetype = 'image/webp' + } await mediaStore.saveMediaBuffer(fileName, buffer) messagePayload = { filename: payload[payload.type].filename, diff --git a/src/services/transformer.ts b/src/services/transformer.ts index 4b0a22ec..efcd4e32 100644 --- a/src/services/transformer.ts +++ b/src/services/transformer.ts @@ -464,6 +464,7 @@ export const toBaileysMessageContent = (payload: any, customMessageCharactersFun case 'audio': case 'document': case 'video': + case 'sticker': const link = payload[type].link if (link) { let mimetype: string = getMimetype(payload) diff --git a/src/utils/sticker_convert.ts b/src/utils/sticker_convert.ts new file mode 100644 index 00000000..0459fafb --- /dev/null +++ b/src/utils/sticker_convert.ts @@ -0,0 +1,15 @@ +import sharp from 'sharp' + +type StickerConvertOptions = { + animated?: boolean +} + +export const MAX_STICKER_BYTES = 8 * 1024 * 1024 + +export const convertToWebpSticker = async (input: Buffer, opts: StickerConvertOptions = {}) => { + const image = sharp(input, { animated: !!opts.animated }) + return image + .resize(512, 512, { fit: 'inside', withoutEnlargement: true }) + .webp({ lossless: !opts.animated, quality: 80, effort: 4 }) + .toBuffer() +} \ No newline at end of file