From a664eda6159fe98f8f93f368e94c7559a7aad0ad Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Fri, 6 Mar 2026 23:48:37 -0800 Subject: render blossom images using MIME type from imeta tags URLs without file extensions (like blossom hashes) are now detected as images when the imeta tag includes m image/*. Co-Authored-By: Claude Opus 4.6 --- src/components/ChatMessage.svelte | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) (limited to 'src/components') diff --git a/src/components/ChatMessage.svelte b/src/components/ChatMessage.svelte index dbdde5a0..91012f46 100644 --- a/src/components/ChatMessage.svelte +++ b/src/components/ChatMessage.svelte @@ -3,14 +3,24 @@ let { content, tags = [] }: { content: string; tags?: any[] } = $props(); - // Extract image URLs from imeta tags not already in content - let imetaUrls = $derived( + // Parse imeta tags for URLs and MIME types + let imeta = $derived( tags .filter((t) => t[0] === "imeta") - .map((t) => t.find((v) => v.startsWith("url "))?.slice(4)) - .filter((url): url is string => !!url && !content.includes(url)), + .map((t) => { + const url = t.find((v) => v.startsWith("url "))?.slice(4); + const mime = t.find((v) => v.startsWith("m "))?.slice(2) || ""; + return { url, mime }; + }) + .filter((m): m is { url: string; mime: string } => !!m.url), ); + // URLs from imeta not already in content + let imetaUrls = $derived(imeta.filter((m) => !content.includes(m.url!)).map((m) => m.url)); + + // Set of URLs that imeta says are images (by MIME type or blossom-style hash URLs) + let imetaImageUrls = $derived(new Set(imeta.filter((m) => m.mime.startsWith("image/")).map((m) => m.url))); + let parts = $derived(parseContent({ content: [content, ...imetaUrls].join("\n"), tags })); const truncUrl = (url: string) => { @@ -36,7 +46,7 @@ {:else if type === "newline"}
{:else if type === "link"} - {#if isImage(value.url)} + {#if isImage(value.url) || imetaImageUrls.has(value.url)} -- cgit v1.2.3