Bind DOM media downloads to chat context

This commit is contained in:
sevenhill
2026-07-06 13:47:32 +03:00
parent e50b99bcd2
commit 342fdae404
+71 -8
View File
@@ -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))}`
};
})
};
})
};