Files
openclaw/src/web/inbound/media.ts
2026-02-17 13:36:48 +09:00

77 lines
2.2 KiB
TypeScript

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<ReturnType<typeof createWaSocket>>,
): 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;
}
}