rsshub
Version:
Make RSS Great Again!
105 lines (103 loc) • 4.33 kB
JavaScript
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 };