From 8884a60798ec630839ac7c1e85bd5eaeda0e05b3 Mon Sep 17 00:00:00 2001 From: Cynthia Foxwell Date: Sat, 9 Nov 2024 00:20:37 -0700 Subject: [PATCH] fedimbed.bluesky: cleaner quote video handling, take media from recordWithMedia on quotes --- src/modules/fedimbed.js | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/src/modules/fedimbed.js b/src/modules/fedimbed.js index 3b7a418..579c63c 100644 --- a/src/modules/fedimbed.js +++ b/src/modules/fedimbed.js @@ -120,8 +120,9 @@ async function signedFetch(url, options) { return await fetch(url, options); } -async function blueskyQuoteEmbed(quote, videos) { +async function blueskyQuoteEmbed(quote) { const embeds = []; + const videos = []; const mainEmbed = { color: PLATFORM_COLORS.bluesky, @@ -158,6 +159,23 @@ async function blueskyQuoteEmbed(quote, videos) { embeds.push({...mainEmbed, fields: [{name: "\u200b", value: `[Video Link](${videoUrl})`}]}); break; } + case "app.bsky.embed.recordWithMedia#view": { + if (embed.media.$type === "app.bsky.embed.images#view") { + embeds.push(...embed.media.images.map((image) => ({...mainEmbed, image: {url: image.fullsize}}))); + } else if (embed.media.$type === "app.bsky.embed.video#view") { + const videoUrl = `https://bsky.social/xrpc/com.atproto.sync.getBlob?did=${encodeURIComponent( + quote.author.did + )}&cid=${embed.media.cid}`; + const contentType = await fetch(videoUrl, { + method: "HEAD", + }).then((res) => res.headers.get("Content-Type")); + + videos.push({url: videoUrl, desc: embed.alt, type: contentType}); + + embeds.push({...mainEmbed, fields: [{name: "\u200b", value: `[Video Link](${videoUrl})`}]}); + } + break; + } default: { embeds.push(mainEmbed); break; @@ -167,7 +185,7 @@ async function blueskyQuoteEmbed(quote, videos) { embeds.push(mainEmbed); } - return embeds; + return {embeds, videos}; } async function bluesky(msg, url, spoiler = false) { @@ -249,7 +267,11 @@ async function bluesky(msg, url, spoiler = false) { } case "app.bsky.embed.record#view": { const quote = post.embed.record; - embeds.push(mainEmbed, ...(await blueskyQuoteEmbed(quote, videos))); + const quoteData = await blueskyQuoteEmbed(quote); + + if (quoteData.videos.length > 0) videos.push(...quoteData.videos); + + embeds.push(mainEmbed, ...quoteData.embeds); break; } case "app.bsky.embed.recordWithMedia#view": { @@ -268,7 +290,10 @@ async function bluesky(msg, url, spoiler = false) { embeds.push({...mainEmbed, fields: [{name: "\u200b", value: `[Video Link](${videoUrl})`}]}); } - embeds.push(...(await blueskyQuoteEmbed(post.embed.record.record, videos))); + const quoteData = await blueskyQuoteEmbed(post.embed.record.record); + if (quoteData.videos.length > 0) videos.push(...quoteData.videos); + embeds.push(...quoteData.embeds); + break; } default: {