import type { proto, WAMessage } from "@whiskeysockets/baileys"; import { downloadMediaMessage, normalizeMessageContent } from "@whiskeysockets/baileys"; import { logVerbose } from "../../globals.js"; import type { createWaSocket } from "../session.js"; function unwrapMessage(message: proto.IMessage | undefined): proto.IMessage | undefined { const normalized = normalizeMessageContent(message); return normalized; } /** * Resolve the MIME type for an inbound media message. * Falls back to WhatsApp's standard formats when Baileys omits the MIME. */ function resolveMediaMimetype(message: proto.IMessage): string | undefined { const explicit = message.imageMessage?.mimetype ?? message.videoMessage?.mimetype ?? message.documentMessage?.mimetype ?? message.audioMessage?.mimetype ?? message.stickerMessage?.mimetype ?? undefined; if (explicit) { return explicit; } // WhatsApp voice messages (PTT) and audio use OGG Opus by default if (message.audioMessage) { return "audio/ogg; codecs=opus"; } if (message.imageMessage) { return "image/jpeg"; } if (message.videoMessage) { return "video/mp4"; } if (message.stickerMessage) { return "image/webp"; } return undefined; } export async function downloadInboundMedia( msg: proto.IWebMessageInfo, sock: Awaited>, ): Promise<{ buffer: Buffer; mimetype?: string; fileName?: string } | undefined> { const message = unwrapMessage(msg.message as proto.IMessage | undefined); if (!message) { return undefined; } const mimetype = resolveMediaMimetype(message); const fileName = message.documentMessage?.fileName ?? undefined; if ( !message.imageMessage && !message.videoMessage && !message.documentMessage && !message.audioMessage && !message.stickerMessage ) { return undefined; } try { const buffer = await downloadMediaMessage( msg as WAMessage, "buffer", {}, { reuploadRequest: sock.updateMediaMessage, logger: sock.logger, }, ); return { buffer, mimetype, fileName }; } catch (err) { logVerbose(`downloadMediaMessage failed: ${String(err)}`); return undefined; } }