rsshub
Version:
Make RSS Great Again!
402 lines (396 loc) • 15.5 kB
JavaScript
import { t as rofetch } from "./ofetch-C3ts-Hud.mjs";
import "./types-DNj6Etbg.mjs";
import { t as parseDate } from "./parse-date-Cr0wQjV_.mjs";
import { load } from "cheerio";
//#region lib/routes/jbma/report.ts
const handler = async (ctx) => {
const { filter } = ctx.req.param();
const limit = Number(ctx.req.query("limit") ?? "50");
const apiSlug = "wp-json/wp/v2";
const baseUrl = "https://jbma.net";
const apiUrl = new URL(`${apiSlug}/report`, baseUrl).href;
let targetUrl = new URL("report/", baseUrl).href;
const [taxonomy, keyword] = filter ? filter.includes("/") ? filter.split("/") : [void 0, filter] : [void 0, void 0];
let searchId = void 0;
if (taxonomy && keyword) {
const apiSearchUrl = new URL(`${apiSlug}/${taxonomy}`, baseUrl).href;
const searchObj = (await rofetch(apiSearchUrl, { query: { search: keyword } })).find((c) => c.slug === keyword || c.name === keyword);
searchId = searchObj?.id ?? void 0;
targetUrl = searchObj?.link ?? targetUrl;
}
const response = await rofetch(apiUrl, { query: {
_embed: "true",
per_page: limit,
...taxonomy && searchId ? { [taxonomy]: searchId } : { search: keyword }
} });
const $ = load(await rofetch(targetUrl));
const language = $("html").attr("lang") ?? "ja";
const postIds = [];
const regExp = new RegExp(String.raw`^${baseUrl.replaceAll(/[.*+?^${}()|[\]\\]/g, String.raw`\$&`)}/?(?:[a-zA-Z0-9-]+/)*\?p=\d+$`);
for (const item of response.slice(0, limit)) {
const linkUrl = item.link;
if (linkUrl && regExp.test(linkUrl)) postIds.push(item.id);
}
const mediaMap = /* @__PURE__ */ new Map();
if (postIds.length > 0) {
const mediaApiUrl = new URL(`${apiSlug}/media`, baseUrl).href;
const mediaResponse = await rofetch(mediaApiUrl, { query: {
parent: postIds.join(","),
per_page: 100
} });
for (const media of mediaResponse) {
if (!media.parent) continue;
const existing = mediaMap.get(media.parent);
if (existing) existing.push(media);
else mediaMap.set(media.parent, [media]);
}
}
const items = response.slice(0, limit).map((item) => {
const title = item.title?.rendered ?? item.title;
const description = item.content?.rendered ?? void 0;
const pubDate = item.date_gmt;
const categories = (item._embedded?.["wp:term"])?.flat().map((c) => c.name) ?? [];
const authors = item._embedded?.author?.map((author) => ({
name: author.name,
url: author.link,
avatar: author.avatar_urls?.["96"] ?? author.avatar_urls?.["48"] ?? author.avatar_urls?.["24"] ?? void 0
})) ?? [];
const guid = item.guid?.rendered ?? item.guid;
const updated = item.modified_gmt ?? pubDate;
let image = item._embedded?.["wp:featuredmedia"]?.[0].source_url ?? void 0;
let enclosureUrl;
let enclosureType;
let enclosureTitle;
let enclosureLength;
let linkUrl = item.link;
if (linkUrl && regExp.test(linkUrl)) {
const mediaItems = mediaMap.get(item.id);
if (mediaItems && mediaItems.length > 0) {
const media = mediaItems[0];
if (media.source_url) {
enclosureUrl = media.source_url;
enclosureType = media.mime_type;
enclosureTitle = media.title?.rendered ?? media.title;
enclosureLength = Number(media.media_details?.filesize);
linkUrl = enclosureUrl;
}
if (!image && media.media_details?.sizes?.full?.source_url) image = media.media_details.sizes.full.source_url;
}
}
if (!linkUrl || regExp.test(linkUrl)) linkUrl = new URL(`report/${item.slug}`, baseUrl).href;
let processedItem = {
title,
description,
pubDate: pubDate ? parseDate(pubDate) : void 0,
link: linkUrl ?? guid,
category: categories,
author: authors,
guid,
id: guid,
content: {
html: description,
text: description
},
image,
banner: image,
updated: updated ? parseDate(updated) : void 0,
language
};
if (enclosureUrl) processedItem = {
...processedItem,
enclosure_url: enclosureUrl,
enclosure_type: enclosureType,
enclosure_title: enclosureTitle || title,
enclosure_length: enclosureLength
};
return processedItem;
});
return {
title: $("title").text(),
description: $("meta[property=\"og:description\"]").attr("content"),
link: targetUrl,
item: items,
allowEmpty: true,
image: $("meta[property=\"og:image\"]").attr("content"),
author: $("meta[property=\"og:site_name\"]").attr("content"),
language,
id: targetUrl
};
};
const options = [
{
label: "すべて",
value: ""
},
{
label: "Metals Forcus",
value: "cat_report/metals-forcus"
},
{
label: "WPIC",
value: "cat_report/wpic"
},
{
label: "Incrementum",
value: "cat_report/incrementum"
},
{
label: "東京金融取引所",
value: "cat_report/tfx"
},
{
label: "池水執筆・出演",
value: "cat_report/ikemizu"
},
{
label: "note",
value: "cat_report/note"
},
{
label: "その他",
value: "cat_report/other"
},
{
label: "In Gold We Trust",
value: "tag_report/in-gold-we-trust"
},
{
label: "Precious Metals Weeklyレポート",
value: "tag_report/precious-metals-weekly-report"
},
{
label: "ひろこのマーケットラウンジ",
value: "tag_report/market-lounge"
},
{
label: "その他",
value: "tag_report/other"
},
{
label: "四半期レポート",
value: "tag_report/quarterly-report"
},
{
label: "プラチナ展望",
value: "tag_report/tenbo"
},
{
label: "Gold Compass",
value: "tag_report/gold-compass"
},
{
label: "豆知識",
value: "tag_report/mamechishiki"
},
{
label: "プラチナ投資のエッセンス",
value: "tag_report/essence"
},
{
label: "三菱UFJ信託銀行",
value: "tag_report/mufg"
},
{
label: "石福金属興業",
value: "tag_report/ishifuku"
},
{
label: "OANDA 証券",
value: "tag_report/oanda"
},
{
label: "レポート",
value: "tag_report/report"
}
];
const filterTable = `
| --------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- |
| [Metals Forcus](https://jbma.net/cat_report/metals-forcus/) | [cat_report/metals-forcus](https://rsshub.app/jbma/report/cat_report/metals-forcus) |
| [WPIC](https://jbma.net/cat_report/wpic/) | [cat_report/wpic](https://rsshub.app/jbma/report/cat_report/wpic) |
| [Incrementum](https://jbma.net/cat_report/incrementum/) | [cat_report/incrementum](https://rsshub.app/jbma/report/cat_report/incrementum) |
| [東京金融取引所](https://jbma.net/cat_report/tfx/) | [cat_report/tfx](https://rsshub.app/jbma/report/cat_report/tfx) |
| [池水執筆・出演](https://jbma.net/cat_report/ikemizu/) | [cat_report/ikemizu](https://rsshub.app/jbma/report/cat_report/ikemizu) |
| [note](https://jbma.net/cat_report/note/) | [cat_report/note](https://rsshub.app/jbma/report/cat_report/note) |
| [その他](https://jbma.net/cat_report/other/) | [cat_report/other](https://rsshub.app/jbma/report/cat_report/other) |
| [In Gold We Trust](https://jbma.net/tag_report/in-gold-we-trust/) | [tag_report/in-gold-we-trust](https://rsshub.app/jbma/report/tag_report/in-gold-we-trust) |
| [Precious Metals Weekly レポート](https://jbma.net/tag_report/precious-metals-weekly-report/) | [tag_report/precious-metals-weekly-report](https://rsshub.app/jbma/report/tag_report/precious-metals-weekly-report) |
| [ひろこのマーケットラウンジ](https://jbma.net/tag_report/market-lounge/) | [tag_report/market-lounge](https://rsshub.app/jbma/report/tag_report/market-lounge) |
| [その他](https://jbma.net/tag_report/other/) | [tag_report/other](https://rsshub.app/jbma/report/tag_report/other) |
| [四半期レポート](https://jbma.net/tag_report/quarterly-report/) | [tag_report/quarterly-report](https://rsshub.app/jbma/report/tag_report/quarterly-report) |
| [プラチナ展望](https://jbma.net/tag_report/tenbo/) | [tag_report/tenbo](https://rsshub.app/jbma/report/tag_report/tenbo) |
| [Gold Compass](https://jbma.net/tag_report/gold-compass/) | [tag_report/gold-compass](https://rsshub.app/jbma/report/tag_report/gold-compass) |
| [豆知識](https://jbma.net/tag_report/mamechishiki/) | [tag_report/mamechishiki](https://rsshub.app/jbma/report/tag_report/mamechishiki) |
| [プラチナ投資のエッセンス](https://jbma.net/tag_report/essence/) | [tag_report/essence](https://rsshub.app/jbma/report/tag_report/essence) |
| [三菱 UFJ 信託銀行](https://jbma.net/tag_report/mufg/) | [tag_report/mufg](https://rsshub.app/jbma/report/tag_report/mufg) |
| [石福金属興業](https://jbma.net/tag_report/ishifuku/) | [tag_report/ishifuku](https://rsshub.app/jbma/report/tag_report/ishifuku) |
| [OANDA 証券](https://jbma.net/tag_report/oanda/) | [tag_report/oanda](https://rsshub.app/jbma/report/tag_report/oanda) |
| [レポート](https://jbma.net/tag_report/report/) | [tag_report/report](https://rsshub.app/jbma/report/tag_report/report) |
`;
const route = {
path: "/report/:filter{.+}?",
name: "Precious Metals Report",
url: "jbma.net",
maintainers: ["nczitzk"],
handler,
example: "/jbma/report",
parameters: { filter: {
description: "Filter, all by default, can be found in the corresponding page URL",
options
} },
description: `::: tip
To subscribe to [Metals Forcus](https://jbma.net/cat_report/metals-forcus/), where the source URL is \`https://jbma.net/cat_report/metals-forcus/\`, extract the certain parts from this URL to be used as parameters, resulting in the route as [\`/jbma/report/cat_report/metals-forcus\`](https://rsshub.app/jbma/report/cat_report/metals-forcus).
:::
<details>
<summary>More filters</summary>
| Name | ID |` + filterTable + `
</details>
`,
categories: ["new-media"],
features: {
requireConfig: false,
requirePuppeteer: false,
antiCrawler: false,
supportRadar: true,
supportBT: false,
supportPodcast: false,
supportScihub: false
},
radar: [
{
source: ["jbma.net/:type/:name?"],
target: (params) => {
const type = params.type;
const name = params.name;
if ([
"report",
"cat_report",
"tag_report"
].includes(type)) return `/${type}${name ? `/${name}` : ""}`;
return `/${type}`;
}
},
{
title: "Metals Forcus",
source: ["jbma.net/cat_report/metals-forcus"],
target: "/report/cat_report/metals-forcus"
},
{
title: "WPIC",
source: ["jbma.net/cat_report/wpic"],
target: "/report/cat_report/wpic"
},
{
title: "Incrementum",
source: ["jbma.net/cat_report/incrementum"],
target: "/report/cat_report/incrementum"
},
{
title: "東京金融取引所",
source: ["jbma.net/cat_report/tfx"],
target: "/report/cat_report/tfx"
},
{
title: "池水執筆・出演",
source: ["jbma.net/cat_report/ikemizu"],
target: "/report/cat_report/ikemizu"
},
{
title: "note",
source: ["jbma.net/cat_report/note"],
target: "/report/cat_report/note"
},
{
title: "その他",
source: ["jbma.net/cat_report/other"],
target: "/report/cat_report/other"
},
{
title: "In Gold We Trust",
source: ["jbma.net/tag_report/in-gold-we-trust"],
target: "/report/tag_report/in-gold-we-trust"
},
{
title: "Precious Metals Weeklyレポート",
source: ["jbma.net/tag_report/precious-metals-weekly-report"],
target: "/report/tag_report/precious-metals-weekly-report"
},
{
title: "ひろこのマーケットラウンジ",
source: ["jbma.net/tag_report/market-lounge"],
target: "/report/tag_report/market-lounge"
},
{
title: "その他",
source: ["jbma.net/tag_report/other"],
target: "/report/tag_report/other"
},
{
title: "四半期レポート",
source: ["jbma.net/tag_report/quarterly-report"],
target: "/report/tag_report/quarterly-report"
},
{
title: "プラチナ展望",
source: ["jbma.net/tag_report/tenbo"],
target: "/report/tag_report/tenbo"
},
{
title: "Gold Compass",
source: ["jbma.net/tag_report/gold-compass"],
target: "/report/tag_report/gold-compass"
},
{
title: "豆知識",
source: ["jbma.net/tag_report/mamechishiki"],
target: "/report/tag_report/mamechishiki"
},
{
title: "プラチナ投資のエッセンス",
source: ["jbma.net/tag_report/essence"],
target: "/report/tag_report/essence"
},
{
title: "三菱UFJ信託銀行",
source: ["jbma.net/tag_report/mufg"],
target: "/report/tag_report/mufg"
},
{
title: "石福金属興業",
source: ["jbma.net/tag_report/ishifuku"],
target: "/report/tag_report/ishifuku"
},
{
title: "OANDA 証券",
source: ["jbma.net/tag_report/oanda"],
target: "/report/tag_report/oanda"
},
{
title: "レポート",
source: ["jbma.net/tag_report/report"],
target: "/report/tag_report/report"
}
],
view: 0,
zh: {
path: "/report/:filter{.+}?",
name: "贵金属报告",
url: "jbma.net",
maintainers: ["nczitzk"],
handler,
example: "/jbma/report",
parameters: { filter: {
description: "过滤条件,默认为全部,可在对应页 URL 中找到",
options
} },
description: `::: tip
若订阅 [Metals Forcus](https://jbma.net/cat_report/metals-forcus/),网址为 \`https://jbma.net/cat_report/metals-forcus/\`,请截取 \`https://jbma.net/\` 到末尾 \`/\` 的部分 \`cat_report/metals-forcus\` 作为 \`filter\` 参数填入,此时目标路由为 [\`/jbma/report/cat_report/metals-forcus\`](https://rsshub.app/jbma/report/cat_report/metals-forcus)。
:::
<details>
<summary>更多分类</summary>
| 名称 | ID |` + filterTable + `
</details>
`
}
};
//#endregion
export { handler, route };