diff options
Diffstat (limited to 'src/lib/link-meta')
-rw-r--r-- | src/lib/link-meta/bsky.ts | 27 | ||||
-rw-r--r-- | src/lib/link-meta/link-meta.ts | 38 |
2 files changed, 47 insertions, 18 deletions
diff --git a/src/lib/link-meta/bsky.ts b/src/lib/link-meta/bsky.ts index f4a96a22f..cf43feca8 100644 --- a/src/lib/link-meta/bsky.ts +++ b/src/lib/link-meta/bsky.ts @@ -1,3 +1,4 @@ +import * as apilib from 'lib/api/index' import {LikelyType, LinkMeta} from './link-meta' // import {match as matchRoute} from 'view/routes' import {convertBskyAppUrlIfNeeded, makeRecordUri} from '../strings/url-helpers' @@ -128,3 +129,29 @@ export async function getPostAsQuote( }, } } + +export async function getFeedAsEmbed( + store: RootStoreModel, + url: string, +): Promise<apilib.ExternalEmbedDraft> { + url = convertBskyAppUrlIfNeeded(url) + const [_0, user, _1, rkey] = url.split('/').filter(Boolean) + const feed = makeRecordUri(user, 'app.bsky.feed.generator', rkey) + const res = await store.agent.app.bsky.feed.getFeedGenerator({feed}) + return { + isLoading: false, + uri: feed, + meta: { + url: feed, + likelyType: LikelyType.AtpData, + title: res.data.view.displayName, + }, + embed: { + $type: 'app.bsky.embed.record', + record: { + uri: res.data.view.uri, + cid: res.data.view.cid, + }, + }, + } +} diff --git a/src/lib/link-meta/link-meta.ts b/src/lib/link-meta/link-meta.ts index 6c4ad5384..6863798b4 100644 --- a/src/lib/link-meta/link-meta.ts +++ b/src/lib/link-meta/link-meta.ts @@ -1,8 +1,7 @@ -import he from 'he' import {isBskyAppUrl} from '../strings/url-helpers' import {RootStoreModel} from 'state/index' import {extractBskyMeta} from './bsky' -import {extractHtmlMeta} from './html' +import {LINK_META_PROXY} from 'lib/constants' export enum LikelyType { HTML, @@ -54,26 +53,29 @@ export async function getLinkMeta( try { const controller = new AbortController() const to = setTimeout(() => controller.abort(), timeout || 5e3) - const httpRes = await fetch(url, { - headers: {accept: 'text/html'}, - signal: controller.signal, - }) - const httpResBody = await httpRes.text() + + const response = await fetch( + `${LINK_META_PROXY( + store.session.currentSession?.service || '', + )}${encodeURIComponent(url)}`, + ) + + const body = await response.json() clearTimeout(to) - const httpResMeta = extractHtmlMeta({ - html: httpResBody, - hostname: urlp?.hostname, - pathname: urlp?.pathname, - }) - meta.title = httpResMeta.title ? he.decode(httpResMeta.title) : undefined - meta.description = httpResMeta.description - ? he.decode(httpResMeta.description) - : undefined - meta.image = httpResMeta.image + + const {description, error, image, title} = body + + if (error !== '') { + throw new Error(error) + } + + meta.description = description + meta.image = image + meta.title = title } catch (e) { // failed console.error(e) - meta.error = 'Failed to fetch link' + meta.error = e instanceof Error ? e.toString() : 'Failed to fetch link' } return meta |