fedimbed.bluesky: cleaner quote video handling, take media from recordWithMedia on quotes

This commit is contained in:
Cynthia Foxwell 2024-11-09 00:20:37 -07:00
parent 839f20e7d3
commit 8884a60798

View file

@ -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: {