rsshub
Version:
Make RSS Great Again!
69 lines (68 loc) • 3 kB
JavaScript
import { t as config } from "./config-CCmw1BNE.mjs";
import { t as parseDate } from "./parse-date-Cr0wQjV_.mjs";
import { t as cache_default } from "./cache-BkqOokyU.mjs";
import { t as got_default } from "./got-BTowW50G.mjs";
import { Fragment, jsx, jsxs } from "hono/jsx/jsx-runtime";
import { load } from "cheerio";
import { renderToString } from "hono/jsx/dom/server";
import { raw } from "hono/html";
//#region lib/routes/followin/utils.tsx
const apiUrl = "https://api.followin.io";
const baseUrl = "https://followin.io";
const favicon = `${baseUrl}/favicon.ico`;
const renderThread = (list) => renderToString(/* @__PURE__ */ jsx(Fragment, { children: list.map((item) => /* @__PURE__ */ jsxs(Fragment, { children: [
raw((item.translated_content || item.content).replaceAll("\n", "<br>")),
/* @__PURE__ */ jsx("br", {}),
item.images.length ? item.images.map((image) => /* @__PURE__ */ jsx("img", { src: image })) : null,
item.link_previews.length ? item.link_previews.map((linkPreview) => /* @__PURE__ */ jsxs("a", {
href: linkPreview.link,
children: [
linkPreview.title,
/* @__PURE__ */ jsx("br", {}),
linkPreview.content
]
})) : null,
/* @__PURE__ */ jsx("br", {})
] })) }));
const getBParam = (lang) => ({
a: "web",
b: "",
c: lang,
d: 0,
e: "",
f: "",
g: "",
h: "0.1.0",
i: "official"
});
const getBuildId = () => cache_default.tryGet("followin:buildId", async () => {
const { data: pageResponse } = await got_default(baseUrl);
const $ = load(pageResponse);
const { buildId } = JSON.parse($("script#__NEXT_DATA__").text());
return buildId;
}, config.cache.routeExpire, false);
const getGToken = () => cache_default.tryGet("followin:gtoken", async () => {
const { data } = await got_default.post(`${apiUrl}/user/gtoken`);
return data.data.gtoken;
});
const parseList = (list, lang, buildId) => list.map((item) => ({
title: item.translated_title || item.title,
description: item.translated_content || item.content,
link: `${baseUrl}/${lang === "en" ? "" : `${lang}/`}feed/${item.id}`,
pubDate: parseDate(item.publish_time, "x"),
category: item.tags.map((tag) => tag.name),
author: item.nickname,
nextData: `${baseUrl}/_next/data/${buildId}/${lang}/feed/${item.id}.json`
}));
const parseItem = (item) => cache_default.tryGet(item.link, async () => {
const { data } = await got_default(item.nextData);
const { queries } = data.pageProps.dehydratedState;
const info = queries.find((q) => q.queryKey[0] === "/feed/info").state;
const thread = queries.find((q) => q.queryKey[0] === "/feed/thread");
item.description = thread ? renderThread(thread.state.data.list) : info.data.translated_full_content || info.data.full_content;
item.updated = parseDate(info.dataUpdatedAt, "x");
item.category = [.../* @__PURE__ */ new Set([...item.category, ...info.data.tags.map((tag) => tag.name)])];
return item;
});
//#endregion
export { getBuildId as a, parseList as c, getBParam as i, baseUrl as n, getGToken as o, favicon as r, parseItem as s, apiUrl as t };