Bind DOM media downloads to chat context
This commit is contained in:
+70
-7
@@ -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) {
|
function isPrivateHost(hostname) {
|
||||||
const host = String(hostname || "").toLowerCase();
|
const host = String(hostname || "").toLowerCase();
|
||||||
if (!host || host === "localhost" || host.endsWith(".localhost")) return true;
|
if (!host || host === "localhost" || host.endsWith(".localhost")) return true;
|
||||||
@@ -913,20 +964,28 @@ function isPrivateHost(hostname) {
|
|||||||
|
|
||||||
async function fetchMediaThroughMaxSession(p, mediaUrl) {
|
async function fetchMediaThroughMaxSession(p, mediaUrl) {
|
||||||
if (isDomDownloadUrl(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)) {
|
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)) {
|
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)) {
|
if (isDomEmojiUrl(mediaUrl)) {
|
||||||
|
const request = parseDomEmojiUrl(mediaUrl);
|
||||||
|
await ensureDomMediaChatContext(p, request);
|
||||||
return await downloadDomStickerThroughScreenshot(p, {
|
return await downloadDomStickerThroughScreenshot(p, {
|
||||||
...parseDomEmojiUrl(mediaUrl),
|
...request,
|
||||||
selector: "[data-testid*='emoji' i], [class*='emoji' i], [class*='lottie' i], [class*='emoticon' i], canvas, svg",
|
selector: "[data-testid*='emoji' i], [class*='emoji' i], [class*='lottie' i], [class*='emoticon' i], canvas, svg",
|
||||||
kindLabel: "MAX emoji canvas",
|
kindLabel: "MAX emoji canvas",
|
||||||
acceptSmall: true,
|
acceptSmall: true,
|
||||||
@@ -2906,10 +2965,14 @@ async function extractOpenChatHistory(p, requestedExternalChatId) {
|
|||||||
sentAt: orderedSentAt(message.sentAt),
|
sentAt: orderedSentAt(message.sentAt),
|
||||||
deliveryState: message.deliveryState || null,
|
deliveryState: message.deliveryState || null,
|
||||||
rect: message.rect || null,
|
rect: message.rect || null,
|
||||||
attachments: (message.attachments || []).map((attachment, index) => ({
|
attachments: (message.attachments || []).map((attachment, index) => {
|
||||||
|
const remoteUrl = attachDomMediaChatContext(attachment.remoteUrl, externalId, raw.url);
|
||||||
|
return {
|
||||||
...attachment,
|
...attachment,
|
||||||
externalId: `dommedia:${stableHash(externalId, messageExternalId, attachment.remoteUrl || attachment.externalId || "", String(index))}`
|
remoteUrl,
|
||||||
}))
|
externalId: `dommedia:${stableHash(externalId, messageExternalId, remoteUrl || attachment.externalId || "", String(index))}`
|
||||||
|
};
|
||||||
|
})
|
||||||
};
|
};
|
||||||
})
|
})
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user