UNPKG

rsshub

Version:
105 lines (103 loc) 4.33 kB
import { t as config } from "./config-C37vj7VH.mjs"; import { t as parseDate } from "./parse-date-BrP7mxXf.mjs"; import { t as cache_default } from "./cache-Bo__VnGm.mjs"; import { t as got_default } from "./got-KxxWdaxq.mjs"; import { t as config_not_found_default } from "./config-not-found-Dyp3RlZZ.mjs"; //#region lib/routes/mastodon/utils.ts const allowSiteList = [ "mastodon.social", "pawoo.net", "fosstodon.org", config.mastodon.apiHost ].filter(Boolean); const apiHeaders = (site) => { const { accessToken, apiHost } = config.mastodon; return accessToken && site === apiHost ? { Authorization: `Bearer ${accessToken}` } : {}; }; const mediaParse = (media_attachments) => media_attachments.map((item) => { const selectedUrl = item.remote_url ?? item.url; const description = item.description ?? ""; switch (item.type) { case "gifv": return `<br><video src="${selectedUrl}" autoplay loop>gif ${description}</video>`; case "video": return `<br><video src="${selectedUrl}" controls loop>video ${description}</video>`; case "image": return `<br><img src="${selectedUrl}" alt="image ${description}">`; case "audio": return `<br><audio controls src="${selectedUrl}">audio ${description}</audio>`; case "unknown": default: return `<br><a href="${selectedUrl}">media ${description}</a>`; } }).join(""); const parseStatuses = (data) => data.map((item) => { const accountRepostedBy = item.reblog ? item.account : null; item = item.reblog ?? item; const content = item.content ? item.content.replaceAll(/<span.*?>|<\/span.*?>/gm, "") : ""; const contentRemovedHtml = content.replaceAll(/<(?:.|\n)*?>/gm, "\n"); const author = `${item.account.display_name} (@${item.account.acct})`; const link = item.url; const media = mediaParse(item.media_attachments); return { title: `${accountRepostedBy ? `Re @${accountRepostedBy.username}` : `@${item.account.username}`}: "${item.sensitive === true ? `(CW) ${item.spoiler_text}` : contentRemovedHtml}"`, author, description: item.spoiler_text + "<hr />" + content + media, pubDate: parseDate(item.created_at), link, guid: item.uri }; }); async function getAccountStatuses(site, account_id, only_media) { const data = (await got_default({ method: "get", url: `https://${site}/api/v1/accounts/${account_id}/statuses?only_media=${only_media}`, headers: apiHeaders(site) })).data; let account_data; if (data.length !== 0 && data[0].account !== null) account_data = data[0].account; else account_data = (await got_default({ method: "get", url: `https://${site}/api/v1/accounts/${account_id}`, headers: apiHeaders(site) })).data; return { account_data, data }; } async function getAccountIdByAcct(acct) { const mastodonConfig = config.mastodon; const acctHost = acct.split("@").filter(Boolean)[1]; const site = mastodonConfig.apiHost || acctHost; const acctDomain = mastodonConfig.acctDomain || acctHost; if (!(site && acctDomain)) throw new config_not_found_default("Mastodon RSS is disabled due to the lack of <a href=\"https://docs.rsshub.app/deploy/config#route-specific-configurations\">relevant config</a>"); if (!config.feature.allow_user_supply_unsafe_domain && !allowSiteList.includes(site)) throw new config_not_found_default(`RSS for this domain is disabled unless 'ALLOW_USER_SUPPLY_UNSAFE_DOMAIN' is set to 'true' or 'MASTODON_API_HOST' is set.`); const search_url = `https://${site}/api/v2/search`; const cacheUid = `mastodon_acct_id/${site}/${acct}`; return { site, account_id: await cache_default.tryGet(cacheUid, async () => { const search_response = await got_default({ method: "get", url: search_url, headers: apiHeaders(site), searchParams: { q: acct, type: "accounts" } }); const [acctUser, acctHost$1] = acct.split("@").filter(Boolean); let acctOnServer; if (acctHost$1) acctOnServer = acctHost$1 === acctDomain ? acctUser : acctUser + "@" + acctHost$1; else acctOnServer = acctUser; const accountData = search_response.data.accounts.filter((item) => item.acct === acctOnServer); if (accountData.length === 0) throw new Error(`acct ${acct} not found`); return accountData[0].id; }) }; } var utils_default = { apiHeaders, parseStatuses, getAccountStatuses, getAccountIdByAcct, allowSiteList }; //#endregion export { utils_default as t };