rsshub
Version:
Make RSS Great Again!
92 lines (91 loc) • 4.25 kB
JavaScript
import { t as parseDate } from "./parse-date-Cr0wQjV_.mjs";
import { t as md5 } from "./md5-CpIHIxCO.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";
//#region lib/routes/gcores/radio.tsx
const route = {
path: "/radios/:category?",
categories: ["new-media"],
example: "/gcores/radios/45",
parameters: { category: "分类名,默认为全部,可在分类页面的 URL 中找到,如 Gadio News -- 45" },
features: {
requireConfig: false,
requirePuppeteer: false,
antiCrawler: false,
supportBT: false,
supportPodcast: true,
supportScihub: false
},
radar: [{
source: ["gcores.com/categories/:category"],
target: "/radios/:category"
}],
name: "播客",
maintainers: ["eternasuno"],
handler,
url: "gcores.com/radios"
};
async function handler(ctx) {
const category = ctx.req.param("category") || "all";
const limit = Number.parseInt(ctx.req.query("limit")) || 12;
const link = getLink(category);
const $ = load(await get(link));
const title = $("head>title").text();
const description = $("head>meta[name=\"description\"]").attr("content");
const image = $("head>link[rel=\"apple-touch-icon\"]").attr("href");
const api = getApi(category);
api.searchParams.set("include", "media");
api.searchParams.set("page[limit]", limit.toString());
api.searchParams.set("sort", "-published-at");
api.searchParams.set("filter[list-all]", "0");
api.searchParams.set("filter[is-require-privilege]", "0");
api.searchParams.set("fields[radios]", "title,cover,published-at,duration,content,media");
const { data, included } = await get(api);
const audios = {};
for (const media of included) audios[media.id] = media.attributes.audio;
const item = data.map((radio) => {
const { id, attributes, relationships } = radio;
const link = `https://www.gcores.com/radios/${id}`;
const itunes_item_image = `https://image.gcores.com/${attributes.cover}`;
const media_id = relationships.media.data.id;
const enclosure_url = new URL(audios[media_id], "https://alioss.gcores.com/uploads/audio/").href;
const description = renderContentDescription(JSON.parse(attributes.content));
return {
title: attributes.title,
author: "机核 GCORES",
description,
pubDate: parseDate(attributes["published-at"]),
guid: md5(link),
link,
itunes_item_image,
itunes_duration: attributes.duration,
enclosure_url,
enclosure_type: "audio/mpeg"
};
});
return {
title,
link,
description,
language: "zh-CN",
itunes_author: "机核 GCORES",
image: `https://www.gcores.com/${image}`,
item
};
}
const renderContentDescription = (content) => renderToString(content ? /* @__PURE__ */ jsxs(Fragment, { children: [content.blocks?.map((line, index) => line.type === "unstyled" ? /* @__PURE__ */ jsx("p", { children: line.text }, `block-${index}`) : null), Object.values(content.entityMap ?? {}).map((ent, index) => ent.type === "WIDGET" ? /* @__PURE__ */ jsx("p", { children: /* @__PURE__ */ jsx("a", {
href: ent.data.url,
children: ent.data.title
}) }, `widget-${index}`) : null)] }) : /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("p", { children: "机核从2010年开始一直致力于分享游戏玩家的生活,以及深入探讨游戏相关的文化。我们开发原创的播客以及视频节目,一直在不断寻找民间高质量的内容创作者。" }), /* @__PURE__ */ jsx("p", { children: "我们坚信游戏不止是游戏,游戏中包含的科学,文化,历史等各个层面的知识和故事,它们同时也会辐射到二次元甚至电影的领域,这些内容非常值得分享给热爱游戏的您。" })] }));
const get = async (url) => {
return (await got_default({
method: "get",
url: new URL(url, "https://www.gcores.com")
})).data;
};
const getLink = (category) => category === "all" ? "https://www.gcores.com/radios" : `https://www.gcores.com/categories/${category}`;
const getApi = (category) => category === "all" ? new URL("https://www.gcores.com/gapi/v1/radios") : new URL(`https://www.gcores.com/gapi/v1/categories/${category}/radios`);
//#endregion
export { route };