fedimbed: trim alt text

This commit is contained in:
Cynthia Foxwell 2025-05-02 09:59:43 -06:00
parent fc97aaf4d1
commit 6d82d5a95c
Signed by: Cynosphere
SSH key fingerprint: SHA256:H3SM8ufP/uxqLwKSH7xY89TDnbR9uOHzjLoBr0tlajk

View file

@ -249,6 +249,13 @@ async function signedFetch(url, options) {
return await fetch(url, options); return await fetch(url, options);
} }
function trimAltText(str) {
if (str == null) return null;
else if (str.length <= 0) return null;
else if (str.length > 1024) return str.substring(0, 1023) + "\u2026";
else return str;
}
// https://tenor.com/view/12766761978490409957 // https://tenor.com/view/12766761978490409957
// https://github.com/bluesky-social/atproto/blob/main/packages/api/src/rich-text/unicode.ts // https://github.com/bluesky-social/atproto/blob/main/packages/api/src/rich-text/unicode.ts
const encoder = new TextEncoder(); const encoder = new TextEncoder();
@ -396,7 +403,7 @@ async function blueskyQuoteEmbed(quote) {
images.push( images.push(
...embed.images.map((image) => ({ ...embed.images.map((image) => ({
media: {url: image.fullsize}, media: {url: image.fullsize},
description: image.alt.length > 0 ? image.alt : null, description: trimAltText(image.alt),
})) }))
); );
break; break;
@ -406,7 +413,7 @@ async function blueskyQuoteEmbed(quote) {
const domain = lookup.service.find((service) => service.id === "#atproto_pds").serviceEndpoint; const domain = lookup.service.find((service) => service.id === "#atproto_pds").serviceEndpoint;
const videoUrl = `${domain}/xrpc/com.atproto.sync.getBlob?did=${quote.author.did}&cid=${embed.cid}`; const videoUrl = `${domain}/xrpc/com.atproto.sync.getBlob?did=${quote.author.did}&cid=${embed.cid}`;
videos.push({media: {url: videoUrl}, description: embed.alt?.length > 0 ? embed.alt : null}); videos.push({media: {url: videoUrl}, description: trimAltText(embed.alt)});
break; break;
} }
case "app.bsky.embed.recordWithMedia#view": { case "app.bsky.embed.recordWithMedia#view": {
@ -414,7 +421,7 @@ async function blueskyQuoteEmbed(quote) {
images.push( images.push(
...embed.media.images.map((image) => ({ ...embed.media.images.map((image) => ({
media: {url: image.fullsize}, media: {url: image.fullsize},
description: image.alt.length > 0 ? image.alt : null, description: trimAltText(image.alt),
})) }))
); );
} else if (embed.media.$type === "app.bsky.embed.video#view") { } else if (embed.media.$type === "app.bsky.embed.video#view") {
@ -422,7 +429,7 @@ async function blueskyQuoteEmbed(quote) {
const domain = lookup.service.find((service) => service.id === "#atproto_pds").serviceEndpoint; const domain = lookup.service.find((service) => service.id === "#atproto_pds").serviceEndpoint;
const videoUrl = `${domain}/xrpc/com.atproto.sync.getBlob?did=${quote.author.did}&cid=${embed.media.cid}`; const videoUrl = `${domain}/xrpc/com.atproto.sync.getBlob?did=${quote.author.did}&cid=${embed.media.cid}`;
videos.push({media: {url: videoUrl}, description: embed.alt?.length > 0 ? embed.alt : null}); videos.push({media: {url: videoUrl}, description: trimAltText(embed.alt)});
} }
break; break;
} }
@ -542,7 +549,7 @@ async function bluesky(msg, url, spoiler = false) {
images.push( images.push(
...post.embed.images.map((image) => ({ ...post.embed.images.map((image) => ({
media: {url: image.fullsize}, media: {url: image.fullsize},
description: image.alt.length > 0 ? image.alt : null, description: trimAltText(image.alt),
})) }))
); );
break; break;
@ -552,7 +559,7 @@ async function bluesky(msg, url, spoiler = false) {
const domain = lookup.service.find((service) => service.id === "#atproto_pds").serviceEndpoint; const domain = lookup.service.find((service) => service.id === "#atproto_pds").serviceEndpoint;
const videoUrl = `${domain}/xrpc/com.atproto.sync.getBlob?did=${post.author.did}&cid=${post.embed.cid}`; const videoUrl = `${domain}/xrpc/com.atproto.sync.getBlob?did=${post.author.did}&cid=${post.embed.cid}`;
videos.push({media: {url: videoUrl}, description: post.embed.alt?.length > 0 ? post.embed.alt : null}); videos.push({media: {url: videoUrl}, description: trimAltText(post.embed.alt)});
break; break;
} }
case "app.bsky.embed.record#view": { case "app.bsky.embed.record#view": {
@ -574,7 +581,7 @@ async function bluesky(msg, url, spoiler = false) {
images.push( images.push(
...post.embed.media.images.map((image) => ({ ...post.embed.media.images.map((image) => ({
media: {url: image.fullsize}, media: {url: image.fullsize},
description: image.alt.length > 0 ? image.alt : null, description: trimAltText(image.alt),
})) }))
); );
} else if (post.embed.media.$type === "app.bsky.embed.video#view") { } else if (post.embed.media.$type === "app.bsky.embed.video#view") {
@ -582,7 +589,7 @@ async function bluesky(msg, url, spoiler = false) {
const domain = lookup.service.find((service) => service.id === "#atproto_pds").serviceEndpoint; const domain = lookup.service.find((service) => service.id === "#atproto_pds").serviceEndpoint;
const videoUrl = `${domain}/xrpc/com.atproto.sync.getBlob?did=${post.author.did}&cid=${post.embed.media.cid}`; const videoUrl = `${domain}/xrpc/com.atproto.sync.getBlob?did=${post.author.did}&cid=${post.embed.media.cid}`;
videos.push({media: {url: videoUrl}, description: post.embed.alt?.length > 0 ? post.embed.alt : null}); videos.push({media: {url: videoUrl}, description: trimAltText(post.embed.alt)});
} else if (post.embed.media.$type === "app.bsky.embed.external#view") { } else if (post.embed.media.$type === "app.bsky.embed.external#view") {
if (post.embed.media.external.uri.includes("tenor.com")) { if (post.embed.media.external.uri.includes("tenor.com")) {
const url = new URL(post.embed.media.external.uri); const url = new URL(post.embed.media.external.uri);
@ -1071,21 +1078,21 @@ async function processUrl(msg, url, spoiler = false, command = false, inQuote =
for (const attachment of attachments) { for (const attachment of attachments) {
const type = attachment.type?.toLowerCase(); const type = attachment.type?.toLowerCase();
const attDesc = attachment.description ?? attachment.comment; const attDesc = trimAltText(attachment.description ?? attachment.comment);
if (type.startsWith("image")) { if (type.startsWith("image")) {
images.push({ images.push({
media: {url: attachment.url}, media: {url: attachment.url},
description: attDesc?.length > 0 ? attDesc : null, description: attDesc,
}); });
} else if (type.startsWith("video")) { } else if (type.startsWith("video")) {
videos.push({ videos.push({
media: {url: attachment.url}, media: {url: attachment.url},
description: attDesc?.length > 0 ? attDesc : null, description: attDesc,
}); });
} else if (type.startsWith("audio")) { } else if (type.startsWith("audio")) {
audios.push({ audios.push({
url: attachment.url, url: attachment.url,
description: attDesc?.length > 0 ? attDesc : null, description: attDesc,
}); });
} }
} }
@ -1197,21 +1204,21 @@ async function processUrl(msg, url, spoiler = false, command = false, inQuote =
} }
} }
const attDesc = attachment.name ?? attachment.description ?? attachment.comment; const attDesc = trimAltText(attachment.name ?? attachment.description ?? attachment.comment);
if (type.startsWith("image") || mediaType.startsWith("image")) { if (type.startsWith("image") || mediaType.startsWith("image")) {
images.push({ images.push({
media: {url: attUrl}, media: {url: attUrl},
description: attDesc?.length > 0 ? attDesc : null, description: attDesc,
}); });
} else if (type.startsWith("video") || mediaType.startsWith("video")) { } else if (type.startsWith("video") || mediaType.startsWith("video")) {
videos.push({ videos.push({
media: {url: attUrl}, media: {url: attUrl},
description: attDesc?.length > 0 ? attDesc : null, description: attDesc,
}); });
} else if (type.startsWith("audio") || mediaType.startsWith("audio")) { } else if (type.startsWith("audio") || mediaType.startsWith("audio")) {
audios.push({ audios.push({
url: attUrl, url: attUrl,
description: attDesc?.length > 0 ? attDesc : null, description: attDesc,
}); });
} }
} else { } else {
@ -1481,7 +1488,6 @@ async function processUrl(msg, url, spoiler = false, command = false, inQuote =
}); });
} }
for (const video of videos) { for (const video of videos) {
if (video.description?.length === 0) video.description = null;
container.components.push({ container.components.push({
type: 12, type: 12,
items: [video], items: [video],