Skip to content

Commit f8b1c6e

Browse files
committed
fix: preserve animation in GIF and WebP stickers
1 parent 427c994 commit f8b1c6e

1 file changed

Lines changed: 24 additions & 3 deletions

File tree

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

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

2706-
const webpBuffer = await sharp(imageBuffer).webp().toBuffer();
2707-
2708-
return webpBuffer;
2706+
const isAnimated = image.includes('.gif') ||
2707+
(image.includes('.webp') && this.isAnimatedWebp(imageBuffer));
2708+
2709+
if (isAnimated) {
2710+
return await sharp(imageBuffer, { animated: true })
2711+
.webp({ quality: 80, animated: true })
2712+
.toBuffer();
2713+
} else {
2714+
return await sharp(imageBuffer).webp().toBuffer();
2715+
}
27092716
} catch (error) {
27102717
console.error('Erro ao converter a imagem para WebP:', error);
27112718
throw error;
27122719
}
27132720
}
27142721

2722+
private isAnimatedWebp(buffer: Buffer): boolean {
2723+
if (buffer.length < 12) return false;
2724+
2725+
for (let i = 0; i < buffer.length - 4; i++) {
2726+
if (buffer[i] === 0x41 && // 'A'
2727+
buffer[i + 1] === 0x4E && // 'N'
2728+
buffer[i + 2] === 0x49 && // 'I'
2729+
buffer[i + 3] === 0x4D) { // 'M'
2730+
return true;
2731+
}
2732+
}
2733+
return false;
2734+
}
2735+
27152736
public async mediaSticker(data: SendStickerDto, file?: any) {
27162737
const mediaData: SendStickerDto = { ...data };
27172738

0 commit comments

Comments
 (0)