rsshub
Version:
Make RSS Great Again!
169 lines (166 loc) • 5.58 kB
JavaScript
import { t as rofetch } from "./ofetch-C3ts-Hud.mjs";
import { t as parseDate } from "./parse-date-Cr0wQjV_.mjs";
import { t as cache_default } from "./cache-BkqOokyU.mjs";
import { t as timezone } from "./timezone-BBvDwS_3.mjs";
//#region lib/routes/denonbu/news.ts
const route = {
url: "denonbu.jp",
path: "/news/:area?",
categories: ["anime"],
example: "/denonbu/news/azabu",
parameters: { area: "The id of the area or category; values are as follows." },
description: `**Area**
| ID | Group name/Area name |
| ------------- | ------------------------------------------------- |
| akiba | 外神田文芸高校 |
| harajuku | 神宮前参道學園 |
| azabu | 港白金女学院 |
| shibuya | 帝音国際学院 |
| kabuki | 真新宿 GR 学園 |
| deep-okubo | Bellemule(深大久保 DJ&ダンスアカデミー) |
| deep-okubo-k | 輝きノスタルジア(深大久保 DJ&ダンスアカデミー) |
| shinsaibashi | OKINI☆PARTY'S(心斎橋演芸高校) |
| ikebukuro | 池袋電音部(池袋空乗院高校) |
| neotokyo | 東京電脳(東京電脳学園) |
| neonakano | 中野電脳(中野電脳学園) |
| shimokitazawa | Ma'Scar'Piece(北沢音箱高校) |
**Category**
Working category IDs include \`news\` (the default), \`event\`, \`goods\`, \`comic\`, \`movie\`, \`music\` or \`livearchives\`.`,
features: {
requireConfig: false,
requirePuppeteer: false,
antiCrawler: false,
supportBT: false,
supportPodcast: false,
supportScihub: false
},
radar: [
{
source: ["denonbu.jp/news"],
target: "/news"
},
{
source: ["denonbu.jp/event"],
target: "/news/event"
},
{
source: ["denonbu.jp/goods"],
target: "/news/goods"
},
{
source: ["denonbu.jp/comic"],
target: "/news/comic"
},
{
source: ["denonbu.jp/movie"],
target: "/news/movie"
},
{
source: ["denonbu.jp/music"],
target: "/news/music"
},
{
source: ["denonbu.jp/livearchives"],
target: "/news/livearchives"
},
{
source: ["denonbu.jp/area/:area"],
target: "/news/:area"
}
],
name: "新闻",
maintainers: ["outloudvi"],
handler
};
const AREA_NAMES = {
akiba: "外神田文芸高校",
harajuku: "神宮前参道學園",
azabu: "港白金女学院",
shibuya: "帝音国際学院",
kabuki: "真新宿GR学園",
"deep-okubo": "Bellemule(深大久保DJ&ダンスアカデミー)",
"deep-okubo-k": "輝きノスタルジア(深大久保DJ&ダンスアカデミー)",
shinsaibashi: "OKINI☆PARTY'S(心斎橋演芸高校)",
ikebukuro: "池袋電音部(池袋空乗院高校)",
neotokyo: "東京電脳(東京電脳学園)",
neonakano: "中野電脳(中野電脳学園)",
shimokitazawa: "Ma'Scar'Piece(北沢音箱高校)",
news: "新闻",
event: "活动",
goods: "商品",
comic: "漫画",
movie: "影片",
music: "音乐",
livearchives: "Live留档"
};
const BASE_URL = "https://denonbu.jp/backend-api/v1.0.0/";
const COMMON_HEADERS = { "X-API-KEY": "FVpHcMLqyf7v2EubqiLxznC9gVMqBDFFMt4zvkS2" };
const PRIMARY_CATEGORIES = /* @__PURE__ */ new Set([
"news",
"event",
"goods",
"comic",
"movie",
"music",
"livearchives"
]);
const CACHE_TOKEN_KEY = "denonbu-news";
async function getToken() {
const cacheToken = await cache_default.get(CACHE_TOKEN_KEY, false);
if (cacheToken) return cacheToken;
const { token, expires } = (await rofetch(new URL("auths/token/get", BASE_URL).href, { headers: COMMON_HEADERS })).payload;
if (!token) throw new Error("Failed to get token");
cache_default.set(CACHE_TOKEN_KEY, token, expires ? expires - Number(Date.now()) / 1e3 - 1 : 3600);
return token;
}
function buildLink(body) {
switch (body.source_type) {
case "main":
case "deep-okubo":
case "shinsaibashi":
case "neotokyo": {
const { sid, uid } = body;
if (sid && uid) return `https://denonbu.jp/detail/${sid}/${uid}`;
return null;
}
case "tw": {
const { account: { account_id }, uid } = body;
if (account_id && uid) return `https://twitter.com/${account_id}/status/${uid}`;
return null;
}
default: return null;
}
}
async function handler(ctx) {
const { area: _area } = ctx.req.param();
const area = _area ?? "news";
const token = await getToken();
const items = (await rofetch(new URL(`contents/search/${area}?limit=20&offset=0`, BASE_URL).href, { headers: {
...COMMON_HEADERS,
Authorization: `Bearer ${token}`
} })).payload.items.map((item) => {
const { title, body, post_date, category, media } = item;
const link = buildLink(item);
const result = {
title: title ?? body.split("\n", 1)[0],
description: body,
pubDate: timezone(parseDate(post_date), 9),
category: category.map((x) => x.name),
link: link ?? void 0
};
if (media?.[0]) {
const firstMedia = media[0];
const imageUrl = typeof firstMedia === "string" ? firstMedia : firstMedia?.url;
if (typeof imageUrl === "string") result.image = imageUrl;
}
return result;
});
return {
title: `電音部新闻 - ${AREA_NAMES[area] ?? area}`,
link: PRIMARY_CATEGORIES.has(area) ? `https://denonbu.jp/${area}` : `https://denonbu.jp/area/${area}`,
item: items,
language: "ja"
};
}
//#endregion
export { route };