rsshub
Version:
Make RSS Great Again!
96 lines (94 loc) • 3.64 kB
JavaScript
import "./esm-shims-CzJ_djXG.mjs";
import "./config-C37vj7VH.mjs";
import "./dist-BInvbO1W.mjs";
import "./logger-Czu8UMNd.mjs";
import { t as ofetch_default } from "./ofetch-BIyrKU3Y.mjs";
import { t as parseDate } from "./parse-date-BrP7mxXf.mjs";
import { t as cache_default } from "./cache-Bo__VnGm.mjs";
import { t as timezone } from "./timezone-D8cuwzTY.mjs";
import { load } from "cheerio";
//#region lib/routes/ctinews/topic.ts
const route = {
path: "/topic/:topic?",
categories: ["new-media"],
example: "/ctinews/topic/KDdek5vgXx",
parameters: { topic: "話題 ID,可在 URL 中獲取,留空為 `KDdek5vgXx`" },
features: {
requireConfig: false,
requirePuppeteer: false,
antiCrawler: false,
supportBT: false,
supportPodcast: false,
supportScihub: false
},
radar: [{ source: ["ctinews.com/news/topics/:topic", "ctinews.com"] }],
name: "話題",
maintainers: ["TonyRL"],
handler,
url: "ctinews.com"
};
async function handler(ctx) {
const { topic = "KDdek5vgXx" } = ctx.req.param();
const baseUrl = "https://www.ctinews.com";
const link = `${baseUrl}/news/topics/${topic}`;
const $ = load(await ofetch_default(link));
const list = [
...$(".hero-news__layer .news-link").toArray().map((item) => {
const $item = $(item);
return {
title: $item.attr("title"),
link: $item.attr("href")?.startsWith("http") ? $item.attr("href") : baseUrl + $item.attr("href")
};
}),
...$(".second-section .news-link").toArray().map((item) => {
const $item = $(item);
return {
title: $item.attr("title"),
link: $item.attr("href")?.startsWith("http") ? $item.attr("href") : baseUrl + $item.attr("href")
};
}),
...$(".news-section .news-link.absolute").toArray().map((item) => {
const $item = $(item);
return {
title: $item.attr("title")?.replace("點擊觀看", ""),
link: $item.attr("href")?.startsWith("http") ? $item.attr("href") : baseUrl + $item.attr("href")
};
})
];
const seen = /* @__PURE__ */ new Set();
const dedupedList = [];
for (const item of list) {
const link$1 = item.link || "";
if (seen.has(link$1)) continue;
seen.add(link$1);
dedupedList.push(item);
}
const items = await Promise.all(dedupedList.map((item) => cache_default.tryGet(item.link, async () => {
const $$1 = load(await ofetch_default(item.link));
if (item.link?.includes("/videos/")) {
const ldJson$1 = JSON.parse($$1("script[type=\"application/ld+json\"]:contains(\"VideoObject\")").text());
item.description = `<iframe id="ytplayer" type="text/html" width="640" height="360" src="https://www.youtube-nocookie.com/embed/${ldJson$1.embedUrl.match(/embed\/([a-zA-Z0-9_-]+)/)?.[1]}" frameborder="0" allowfullscreen referrerpolicy="strict-origin-when-cross-origin"></iframe><br>` + ldJson$1.description.replaceAll("\n", "<br>");
item.pubDate = timezone(parseDate(ldJson$1.uploadDate), 8);
item.image = ldJson$1.thumbnailUrl[0];
return item;
}
const ldJson = JSON.parse($$1("script[type=\"application/ld+json\"]:contains(\"NewsArticle\")").text());
const description = $$1(".rendered-content");
description.find(".show-in-md, .article-promote-items, [data-ad-part]").remove();
item.description = description.html();
item.pubDate = parseDate(ldJson.datePublished);
item.category = [...new Set([ldJson.articleSection, ...ldJson.keywords])];
item.author = ldJson.author?.name ?? ldJson.publisher?.name;
return item;
})));
return {
title: $("title").text(),
description: $("meta[name=\"description\"]").attr("content"),
link,
image: `${baseUrl}/favicon.ico`,
language: "zh-TW",
item: items
};
}
//#endregion
export { route };