Bind DOM media downloads to chat context
This commit is contained in:
+71
-8
@@ -900,6 +900,57 @@ function parseDomEmojiUrl(value) {
|
||||
}
|
||||
}
|
||||
|
||||
function domMediaPrefixForUrl(value) {
|
||||
const raw = String(value || "");
|
||||
if (isDomDownloadUrl(raw)) return domDownloadPrefix;
|
||||
if (isDomAudioUrl(raw)) return domAudioPrefix;
|
||||
if (isDomStickerUrl(raw)) return domStickerPrefix;
|
||||
if (isDomEmojiUrl(raw)) return domEmojiPrefix;
|
||||
return null;
|
||||
}
|
||||
|
||||
function parseDomMediaUrl(value) {
|
||||
const prefix = domMediaPrefixForUrl(value);
|
||||
if (!prefix) {
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
return JSON.parse(decodeURIComponent(String(value).slice(prefix.length)));
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
function attachDomMediaChatContext(value, externalChatId, chatUrl) {
|
||||
const prefix = domMediaPrefixForUrl(value);
|
||||
if (!prefix) {
|
||||
return value;
|
||||
}
|
||||
|
||||
const parsed = parseDomMediaUrl(value);
|
||||
if (!parsed) {
|
||||
return value;
|
||||
}
|
||||
|
||||
const next = {
|
||||
...parsed,
|
||||
externalChatId: parsed.externalChatId || externalChatId || null,
|
||||
chatUrl: normalizeMaxChatUrl(parsed.chatUrl) || normalizeMaxChatUrl(chatUrl) || null
|
||||
};
|
||||
return `${prefix}${encodeURIComponent(JSON.stringify(next))}`;
|
||||
}
|
||||
|
||||
async function ensureDomMediaChatContext(p, request) {
|
||||
const externalChatId = String(request?.externalChatId || "").trim();
|
||||
const chatUrl = normalizeMaxChatUrl(request?.chatUrl);
|
||||
if (!externalChatId && !chatUrl) {
|
||||
return;
|
||||
}
|
||||
|
||||
await ensureDomChatOpen(p, externalChatId, 5000, false, chatUrl);
|
||||
}
|
||||
|
||||
function isPrivateHost(hostname) {
|
||||
const host = String(hostname || "").toLowerCase();
|
||||
if (!host || host === "localhost" || host.endsWith(".localhost")) return true;
|
||||
@@ -913,20 +964,28 @@ function isPrivateHost(hostname) {
|
||||
|
||||
async function fetchMediaThroughMaxSession(p, mediaUrl) {
|
||||
if (isDomDownloadUrl(mediaUrl)) {
|
||||
return await downloadDomAttachmentThroughClick(p, parseDomDownloadUrl(mediaUrl));
|
||||
const request = parseDomDownloadUrl(mediaUrl);
|
||||
await ensureDomMediaChatContext(p, request);
|
||||
return await downloadDomAttachmentThroughClick(p, request);
|
||||
}
|
||||
|
||||
if (isDomAudioUrl(mediaUrl)) {
|
||||
return await downloadDomAudioThroughPlay(p, parseDomAudioUrl(mediaUrl));
|
||||
const request = parseDomAudioUrl(mediaUrl);
|
||||
await ensureDomMediaChatContext(p, request);
|
||||
return await downloadDomAudioThroughPlay(p, request);
|
||||
}
|
||||
|
||||
if (isDomStickerUrl(mediaUrl)) {
|
||||
return await downloadDomStickerThroughScreenshot(p, parseDomStickerUrl(mediaUrl));
|
||||
const request = parseDomStickerUrl(mediaUrl);
|
||||
await ensureDomMediaChatContext(p, request);
|
||||
return await downloadDomStickerThroughScreenshot(p, request);
|
||||
}
|
||||
|
||||
if (isDomEmojiUrl(mediaUrl)) {
|
||||
const request = parseDomEmojiUrl(mediaUrl);
|
||||
await ensureDomMediaChatContext(p, request);
|
||||
return await downloadDomStickerThroughScreenshot(p, {
|
||||
...parseDomEmojiUrl(mediaUrl),
|
||||
...request,
|
||||
selector: "[data-testid*='emoji' i], [class*='emoji' i], [class*='lottie' i], [class*='emoticon' i], canvas, svg",
|
||||
kindLabel: "MAX emoji canvas",
|
||||
acceptSmall: true,
|
||||
@@ -2906,10 +2965,14 @@ async function extractOpenChatHistory(p, requestedExternalChatId) {
|
||||
sentAt: orderedSentAt(message.sentAt),
|
||||
deliveryState: message.deliveryState || null,
|
||||
rect: message.rect || null,
|
||||
attachments: (message.attachments || []).map((attachment, index) => ({
|
||||
...attachment,
|
||||
externalId: `dommedia:${stableHash(externalId, messageExternalId, attachment.remoteUrl || attachment.externalId || "", String(index))}`
|
||||
}))
|
||||
attachments: (message.attachments || []).map((attachment, index) => {
|
||||
const remoteUrl = attachDomMediaChatContext(attachment.remoteUrl, externalId, raw.url);
|
||||
return {
|
||||
...attachment,
|
||||
remoteUrl,
|
||||
externalId: `dommedia:${stableHash(externalId, messageExternalId, remoteUrl || attachment.externalId || "", String(index))}`
|
||||
};
|
||||
})
|
||||
};
|
||||
})
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user