rsshub
Version:
Make RSS Great Again!
95 lines (93 loc) • 4.21 kB
JavaScript
import { t as config } from "./config-MQ-7ebJ_.mjs";
import { t as parseDate } from "./parse-date-r5WDWHno.mjs";
import { t as got_default } from "./got-CO-ndVl2.mjs";
import { jsx } from "hono/jsx/jsx-runtime";
import { load } from "cheerio";
import { renderToString } from "hono/jsx/dom/server";
//#region lib/routes/yahoo/news/utils.tsx
const getArchive = async (region, limit, tag, providerId) => {
const { data: response } = await got_default(`https://${region}.news.yahoo.com/_td-news/api/resource/NCPListService;api=archive;ncpParams=${encodeURIComponent(JSON.stringify({ query: {
count: limit,
start: 0,
providerid: providerId,
tag
} }))}`);
return response;
};
const getList = async (region, listId) => {
const { data: response } = await got_default(`https://${region}.news.yahoo.com/_td-news/api/resource/StreamService;category=LISTID%3A${listId};useNCP=true`);
return response;
};
const getCategories = (region, tryGet) => tryGet(`yahoo:${region}:categoryMap`, async () => {
const { PageStore } = await getStores(region, tryGet);
const { Col1: col1 } = PageStore.pagesConfigRaw.base.section.regions;
const { categoryMap } = col1.find((c) => c.name === "ArchiveFilterBar").props;
for (const [key, value] of Object.entries(categoryMap)) categoryMap[key] = {
name: value,
yctMap: col1.find((c) => c.name === "StreamContainerArchive").props.yctMap[key]
};
return categoryMap;
});
const getProviderList = (region, tryGet) => tryGet(`yahoo:${region}:providerList`, async () => {
const { ProviderListStore } = await getStores(region, tryGet);
return ProviderListStore.providerList.flatMap((list) => list.providers.map((provider) => ({
title: `${list.title} - ${provider.title}`,
key: provider.key,
link: new URL(provider.url, `https://${region}.news.yahoo.com`).href
})));
});
const getStores = (region, tryGet) => tryGet(`yahoo:${region}:stores`, async () => {
const { data: response } = await got_default(`https://${region}.news.yahoo.com/archive`);
const $ = load(response);
return JSON.parse($("script:contains(\"root.App.main\")").text().match(/root.App.main\s+=\s+({.+});/)?.[1]).context.dispatcher.stores;
});
const parseList = (region, response) => response.map((item) => ({
title: item.title,
link: item.url.startsWith("http") ? item.url : new URL(item.url, `https://${region}.news.yahoo.com`).href,
description: item.summary,
pubDate: parseDate(item.published_at, "X")
}));
const parseItem = (item, tryGet) => tryGet(item.link, async () => {
const { data: response } = await got_default(item.link, { headers: { "User-Agent": config.trueUA } });
const $ = load(response);
const ldJson = JSON.parse($("script[type=\"application/ld+json\"]").toArray().find((ele) => $(ele).text().includes("\"@type\":\"NewsArticle\""))?.children[0].data);
const author = ldJson.author.name;
const body = $(".atoms");
body.find("noscript, .text-gandalf, [id^=\"sda-inbody-\"]").remove();
body.find(".caas-figure-with-pb, .caas-img-container").each((_, ele) => {
$(ele).removeAttr("style");
});
body.find("img").each((_, ele) => {
const $ele = $(ele);
let dataSrc = $ele.data("src");
if (dataSrc) {
const match = dataSrc.match(/.*--\/.*--\/(.*)/);
if (match?.[1]) dataSrc = match?.[1];
$ele.attr("src", dataSrc);
$ele.removeAttr("data-src");
}
});
body.find(".caas-iframe").each((_, ele) => {
const $ele = $(ele);
if ($ele.data("type") === "youtube") {
const blockquoteSrc = $ele.find("blockquote").data("src");
$ele.replaceWith(renderToString(/* @__PURE__ */ jsx("iframe", {
width: "560",
height: "315",
src: `https://www.youtube-nocookie.com/embed/${blockquoteSrc.split("/").pop()?.split("?")?.[0]}`,
frameborder: "0",
allow: "encrypted-media; picture-in-picture; web-share",
allowfullscreen: true,
referrerpolicy: "strict-origin-when-cross-origin"
})));
}
});
item.description = body.html();
item.author = author;
item.category = ldJson.keywords;
item.pubDate = parseDate(ldJson.datePublished);
item.updated = parseDate(ldJson.dateModified);
return item;
});
//#endregion
export { parseItem as a, getProviderList as i, getCategories as n, parseList as o, getList as r, getArchive as t };