UNPKG

rsshub

Version:
96 lines (94 loc) 3.64 kB
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 };