ADD: 中山大学 - 数据科学与计算机学院 - 动态 (#1172)
* t-guru: added support for models & categories * t-guru: fixed title * added J-Bus support * ADD: SYSU SDCS
This commit is contained in:
parent
01c058e7d3
commit
0aab5a175f
|
|
@ -1560,6 +1560,10 @@ category 列表:
|
|||
|
||||
</route>
|
||||
|
||||
### 中山大学
|
||||
|
||||
<route name="数据科学与计算机学院动态" author="MegrezZhu" example="/sysu/sdcs" path="/sysu/sdcs" />
|
||||
|
||||
## 传统媒体
|
||||
|
||||
### 央视新闻
|
||||
|
|
|
|||
|
|
@ -853,6 +853,9 @@ router.get('/javbus/western/home', require('./routes/javbus/western/home'));
|
|||
router.get('/javbus/western/genre/:gid', require('./routes/javbus/western/genre'));
|
||||
router.get('/javbus/western/star/:sid', require('./routes/javbus/western/star'));
|
||||
|
||||
// 中山大学
|
||||
router.get('/sysu/sdcs', require('./routes/universities/sysu/sdcs'));
|
||||
|
||||
// 動畫瘋
|
||||
router.get('/anigamer/new_anime', require('./routes/anigamer/new_anime'));
|
||||
router.get('/anigamer/anime/:sn', require('./routes/anigamer/anime'));
|
||||
|
|
|
|||
|
|
@ -0,0 +1,55 @@
|
|||
const axios = require('../../../utils/axios');
|
||||
const { load } = require('cheerio');
|
||||
const { resolve } = require('url');
|
||||
|
||||
const base = 'http://sdcs.sysu.edu.cn/';
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const { data } = await axios.get('http://sdcs.sysu.edu.cn/');
|
||||
const $ = load(data);
|
||||
|
||||
const urls = $('.view-content li > a')
|
||||
.map((_, ele) => $(ele).attr('href'))
|
||||
.toArray()
|
||||
.map((path) => path.match(/\/content\/(\d+)/)[1]) // extract article-id
|
||||
.sort()
|
||||
.reverse() // sort by article-id (or to say, date), latest first
|
||||
.map((aid) => resolve(base, `/content/${aid}`));
|
||||
|
||||
ctx.state.data = {
|
||||
title: '中山大学 - 数据科学与计算机学院',
|
||||
link: 'http://sdcs.sysu.edu.cn/',
|
||||
description: '中山大学 - 数据科学与计算机学院',
|
||||
item: await getDetails(ctx.cache, urls),
|
||||
};
|
||||
};
|
||||
|
||||
const getDetails = (cache, urls) => Promise.all(urls.map((url) => cache.tryGet(url, () => getDetail(url), 24 * 60 * 60)));
|
||||
|
||||
const timezone = 8;
|
||||
const serverOffset = new Date().getTimezoneOffset() / 60;
|
||||
const shiftTimezone = (date) => new Date(date.getTime() - 60 * 60 * 1000 * (timezone + serverOffset)).toUTCString();
|
||||
|
||||
const getDetail = async (url) => {
|
||||
const { data } = await axios.get(url);
|
||||
const $ = load(data);
|
||||
|
||||
// transforming images
|
||||
$('.content img').each((_, ele) => {
|
||||
$(ele).attr('referrerpolicy', 'no-referrer');
|
||||
$(ele).attr('src', resolve(base, $(ele).attr('src')));
|
||||
});
|
||||
|
||||
return {
|
||||
title: $('section > h1').text(),
|
||||
description: $('.content').html(),
|
||||
link: url,
|
||||
pubDate: shiftTimezone(
|
||||
new Date(
|
||||
$('.submitted-by')
|
||||
.text()
|
||||
.match(/(\d+\/\d+\/\d+)/)[1]
|
||||
)
|
||||
),
|
||||
};
|
||||
};
|
||||
Loading…
Reference in New Issue