Skip to content

Commit 4440fce

Browse files
matheusmartinsInspermatheusmartinsInsper
authored andcommitted
fix: preserve animation in GIF and WebP stickers
1 parent d85c80f commit 4440fce

File tree

1 file changed

+24
-3
lines changed

1 file changed

+24
-3
lines changed

src/api/integrations/channel/whatsapp/whatsapp.baileys.service.ts

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2348,15 +2348,36 @@ export class BaileysStartupService extends ChannelStartupService {
23482348
imageBuffer = Buffer.from(response.data, 'binary');
23492349
}
23502350

2351-
const webpBuffer = await sharp(imageBuffer).webp().toBuffer();
2352-
2353-
return webpBuffer;
2351+
const isAnimated = image.includes('.gif') ||
2352+
(image.includes('.webp') && this.isAnimatedWebp(imageBuffer));
2353+
2354+
if (isAnimated) {
2355+
return await sharp(imageBuffer, { animated: true })
2356+
.webp({ quality: 80, animated: true })
2357+
.toBuffer();
2358+
} else {
2359+
return await sharp(imageBuffer).webp().toBuffer();
2360+
}
23542361
} catch (error) {
23552362
console.error('Erro ao converter a imagem para WebP:', error);
23562363
throw error;
23572364
}
23582365
}
23592366

2367+
private isAnimatedWebp(buffer: Buffer): boolean {
2368+
if (buffer.length < 12) return false;
2369+
2370+
for (let i = 0; i < buffer.length - 4; i++) {
2371+
if (buffer[i] === 0x41 && // 'A'
2372+
buffer[i + 1] === 0x4E && // 'N'
2373+
buffer[i + 2] === 0x49 && // 'I'
2374+
buffer[i + 3] === 0x4D) { // 'M'
2375+
return true;
2376+
}
2377+
}
2378+
return false;
2379+
}
2380+
23602381
public async mediaSticker(data: SendStickerDto, file?: any) {
23612382
const mediaData: SendStickerDto = { ...data };
23622383

0 commit comments

Comments
 (0)