rss: add bangumi/calendar (#171)

* rss: add bangumi/calendar

* docs: add bangumi/calendar

* Update today.js
This commit is contained in:
阿卡琳
2018-05-21 14:21:00 +08:00
committed by DIYgod
parent cf6ea44b48
commit d0dccf2707
4 changed files with 134 additions and 0 deletions

View File

@@ -246,6 +246,22 @@ areaID: 分区 ID 分区增删较多,可通过 [分区列表](https://api.live
order: 排序方式live_time 开播时间online 人气
## bangumi
### 放送列表
举例: [https://rsshub.app/bangumi/calendar/today](https://rsshub.app/bangumi/calendar/today)
路由: `/bangumi/calendar/today`
参数: 无
::: tip 提示
可以配合[内容过滤](#内容过滤)使用
:::
## 微博
### 博主

View File

@@ -89,6 +89,9 @@ router.get('/bilibili/live/room/:roomID', require('./routes/bilibili/liveRoom'))
router.get('/bilibili/live/search/:key/:order', require('./routes/bilibili/liveSearch'));
router.get('/bilibili/live/area/:areaID/:order', require('./routes/bilibili/liveArea'));
// bangumi
router.get('/bangumi/calendar/today', require('./routes/bangumi/calendar/today'));
// 微博
router.get('/weibo/user/:uid', require('./routes/weibo/user'));
router.get('/weibo/user2/:uid', require('./routes/weibo/user2'));

View File

@@ -0,0 +1,47 @@
const axios = require('../../../utils/axios');
const config = require('../../../config');
module.exports = async (ctx) => {
const bgmCalendarUrl = 'https://api.bgm.tv/calendar';
const bgmDataUrl = 'https://cdn.jsdelivr.net/npm/bangumi-data/dist/data.json';
const url = [bgmCalendarUrl, bgmDataUrl];
const cache = await Promise.all(url.map(ctx.cache.get));
const result = await Promise.all(
cache.map(async (c, i) => {
if (c !== undefined) {
return Promise.resolve(JSON.parse(c));
} else {
const response = await axios({
method: 'get',
url: url[i],
headers: {
'User-Agent': config.ua,
},
});
const data = response.data;
if (i === 1) {
// 只保留有 bangumi id 的番剧
const length = data.items.length;
const items = [];
for (let index = 0; index < length; index++) {
const item = data.items[index];
const bgm_site = item.sites.find((s) => s.site === 'bangumi');
if (bgm_site) {
item.bgm_id = bgm_site.id;
items.push(item);
}
}
data.items = items;
}
ctx.cache.set(url[i], JSON.stringify(data), 86400);
return Promise.resolve(data);
}
})
);
return result;
};

View File

@@ -0,0 +1,68 @@
const getData = require('./_base');
module.exports = async (ctx) => {
const [list, data] = await getData(ctx);
const siteMeta = data.siteMeta;
const now = new Date(Date.now());
now.setHours(now.getHours() + 9);
const day = now.getUTCDay();
const todayList = list.filter((l) => l.weekday.id % 7 === day)[0];
const todayBgmId = todayList.items.map((t) => `${t.id}`);
const images = todayList.items.reduce((p, c) => {
p[c.id] = (c.images || {}).large;
return p;
}, {});
const todayBgm = data.items.filter((d) => todayBgmId.includes(d.bgm_id));
todayBgm.forEach((bgm) => {
bgm.image = images[bgm.bgm_id];
});
ctx.state.data = {
title: 'bangumi 每日放送',
link: 'https://bgm.tv/calendar',
item: todayBgm.map((bgm) => {
const updated = new Date(Date.now());
updated.setSeconds(0);
const begin = new Date(bgm.begin || updated);
updated.setHours(begin.getHours());
updated.setMinutes(begin.getMinutes());
updated.setSeconds(begin.getSeconds());
const image = `<img src=${bgm.image} />`;
const content =
image +
'<ul>' +
bgm.sites
.map((s) => {
let url;
if (s.url) {
url = s.url;
} else {
url = siteMeta[s.site].urlTemplate.replace('{{id}}', s.id);
}
return `<li><a href="${url}">${siteMeta[s.site].title}</a></li>`;
})
.join('') +
'</ul>';
return {
title: [
bgm.title,
Object.values(bgm.titleTranslate)
.map((t) => t.join(''))
.join(''),
].join(''),
updated: updated.toISOString(),
pubDate: updated.toUTCString(),
link: `http://bangumi.tv/subject/${bgm.bgm_id}`,
description: content,
content,
};
}),
};
};