feat: add Eventernote (#5817)

* add eventernote actor route

* extract eventernote event time

* add doc for eventernote

* try smaller event count for eventernote for now

Co-authored-by: Henry Wang <hi@henry.wang>
This commit is contained in:
Henry Wang 2020-10-13 11:23:14 +01:00 committed by GitHub
commit bf8b1e6057
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 112 additions and 0 deletions

View File

@ -136,6 +136,12 @@ pageClass: routes
<Route author="Tsuki" example="/ebb" path="/ebb"/>
## Eventernote
### 声优活动及演唱会
<Route author="KTachibanaM" path="/eventernote/actors/:name/:id" example="/eventernote/actors/三森すずこ/2634" :paramsDesc="['声优姓名', '声优 ID']"/>
## Hanime.tv
### 最近更新

View File

@ -3333,6 +3333,9 @@ router.get('/npc/:caty', require('./routes/npc/index'));
// 高科技行业门户
router.get('/ofweek/news', require('./routes/ofweek/news'));
// eventernote
router.get('/eventernote/actors/:name/:id', require('./routes/eventernote/actors'));
// 八阕
router.get('/popyard/:caty?', require('./routes/popyard/index'));

View File

@ -0,0 +1,103 @@
const got = require('@/utils/got');
const cheerio = require('cheerio');
const dateStringRegex = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/;
const timeStringRegexes = [
/開場 (?<openHr>\d{2}):(?<openMin>\d{2}) 開演 (?<startHr>\d{2}):(?<startMin>\d{2}) 終演 (?<closeHr>\d{2}):(?<closeMin>\d{2})/,
/開場 - 開演 (?<openHr>\d{2}):(?<openMin>\d{2}) 終演 (?<closeHr>\d{2}):(?<closeMin>\d{2})/,
/開場 (?<openHr>\d{2}):(?<openMin>\d{2}) 開演 - 終演 (?<closeHr>\d{2}):(?<closeMin>\d{2})/,
];
const maxPages = 5;
const pageCount = 10;
module.exports = async (ctx) => {
const { name, id } = ctx.params;
const title = `${name}のイベント・ライブ情報一覧`;
const link = `https://www.eventernote.com/actors/${name}/${id}/events`;
const events = [];
for (let page = 1; page <= maxPages; page++) {
const pageLink = link + `?limit=${pageCount}&page=${page}`;
// eslint-disable-next-line no-await-in-loop
const response = await got({
method: 'get',
url: pageLink,
});
const data = response.data;
const $ = cheerio.load(data);
const list = $('li.clearfix');
if (list.length === 0) {
break;
}
for (let i = 0; i < list.length; ++i) {
const event = list[i];
// extract event name
const eventName = $('div.event > h4 > a', event).text();
// extract event location
const eventLocation = $('div.event > div.place > a', event).text();
// extract event date
const dateMatches = $('div.date > p', event).text().match(dateStringRegex);
const eventYear = dateMatches.groups.year;
const eventMonth = dateMatches.groups.month;
const eventDay = dateMatches.groups.day;
// extract event time
const timeString = $('div.event > div.place > span.s', event).text();
let eventTimeObj = {
openHr: null,
openMin: null,
startHr: null,
startMin: null,
closeHr: null,
closeMin: null,
};
for (const r of timeStringRegexes) {
const m = timeString.match(r);
if (m === null) {
continue;
}
eventTimeObj = {
...eventTimeObj,
...m.groups,
};
}
// extract event link
const link = $('div.event > h4 > a', event).attr('href');
// compute event description
const eventDescription = `イベント ${eventName}
開催場所 ${eventLocation}
開場 ${eventYear}-${eventMonth}-${eventDay} ${eventTimeObj.openHr}:${eventTimeObj.openMin}
開演 ${eventYear}-${eventMonth}-${eventDay} ${eventTimeObj.startHr}:${eventTimeObj.startMin}
終演 ${eventYear}-${eventMonth}-${eventDay} ${eventTimeObj.closeHr}:${eventTimeObj.closeHr}
`;
events.push({
title: eventName,
description: eventDescription,
link,
});
}
page += 1;
}
ctx.state.data = {
title,
link,
description: title,
language: 'ja',
allowEmpty: true,
item: events,
};
};