





























@@ -1,6 +1,7 @@
11import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime";
22import { getFileExtension } from "openclaw/plugin-sdk/media-mime";
33import { logVerbose } from "openclaw/plugin-sdk/runtime-env";
4+import { normalizeOptionalString } from "openclaw/plugin-sdk/text-runtime";
4556type DiscordPreflightAudioRuntime = typeof import("./preflight-audio.runtime.js");
67@@ -13,8 +14,10 @@ function loadDiscordPreflightAudioRuntime(): Promise<DiscordPreflightAudioRuntim
13141415type DiscordAudioAttachment = {
1516content_type?: string;
17+duration_secs?: number;
1618filename?: string;
1719url?: string;
20+waveform?: string;
1821};
19222023const AUDIO_ATTACHMENT_MIME_BY_EXT = new Map([
@@ -30,10 +33,16 @@ const AUDIO_ATTACHMENT_MIME_BY_EXT = new Map([
3033]);
31343235function inferAudioAttachmentMime(attachment: DiscordAudioAttachment): string | undefined {
33-const contentType = attachment.content_type?.trim();
36+const contentType = normalizeOptionalString(attachment.content_type);
3437if (contentType?.startsWith("audio/")) {
3538return contentType;
3639}
40+if (
41+typeof attachment.duration_secs === "number" ||
42+typeof normalizeOptionalString(attachment.waveform) === "string"
43+) {
44+return "audio/ogg";
45+}
3746const ext = getFileExtension(attachment.filename ?? attachment.url);
3847return ext ? AUDIO_ATTACHMENT_MIME_BY_EXT.get(ext) : undefined;
3948}
@@ -45,7 +54,7 @@ function collectAudioAttachments(
4554return [];
4655}
4756return attachments.filter(
48-(att) => typeof att.url === "string" && att.url.length > 0 && inferAudioAttachmentMime(att),
57+(att) => normalizeOptionalString(att.url) && inferAudioAttachmentMime(att),
4958);
5059}
5160@@ -91,7 +100,8 @@ export async function resolveDiscordPreflightAudioMentionContext(params: {
91100}
92101const audioUrls = audioAttachments
93102.map((att) => att.url)
94-.filter((url): url is string => typeof url === "string" && url.length > 0);
103+.map((url) => normalizeOptionalString(url))
104+.filter((url): url is string => Boolean(url));
95105if (audioUrls.length > 0) {
96106transcript = await transcribeFirstAudio({
97107ctx: {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。