From 68c9b3aa270518a08e7604d23ef7da0918c402d8 Mon Sep 17 00:00:00 2001 From: KTachibanaM Date: Tue, 6 Oct 2020 19:17:03 -0700 Subject: [PATCH 1/4] add eventernote actor route --- lib/router.js | 3 ++ lib/routes/eventernote/actors.js | 70 ++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 lib/routes/eventernote/actors.js diff --git a/lib/router.js b/lib/router.js index fdba10a887..fc153bf13d 100644 --- a/lib/router.js +++ b/lib/router.js @@ -3292,4 +3292,7 @@ router.get('/gamer/gnn/:category?', require('./routes/gamer/gnn_index')); // 中国人大网 router.get('/npc/:caty', require('./routes/npc/index')); +// eventernote +router.get('/eventernote/actors/:name/:id', require('./routes/eventernote/actors')); + module.exports = router; diff --git a/lib/routes/eventernote/actors.js b/lib/routes/eventernote/actors.js new file mode 100644 index 0000000000..80e72767cc --- /dev/null +++ b/lib/routes/eventernote/actors.js @@ -0,0 +1,70 @@ +const got = require('@/utils/got'); +const cheerio = require('cheerio'); + +const dateStringRegex = /(\d{4})-(\d{2})-(\d{2})/; + +module.exports = async (ctx) => { + const { name, id } = ctx.params; + + const title = `${name}のイベント・ライブ情報一覧`; + const link = `https://www.eventernote.com/actors/${name}/${id}/events`; + + let page = 1; + const events = []; + // eslint-disable-next-line no-constant-condition + while (true) { + const pageLink = link + `?limit=100&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 title + const title = $('div.event > h4 > a', event).text(); + + // extract event location + const location = $('div.event > div.place > a', event).text(); + + // extract event date + const dateMatches = $('div.date > p', event).text().match(dateStringRegex); + const year = parseInt(dateMatches[1]); + const month = parseInt(dateMatches[2]); + const day = parseInt(dateMatches[3]); + const time = new Date(year, month, day); + + // extract event link + const link = $('div.event > h4 > a', event).attr('href'); + + events.push({ + title, + description: location, + pubDate: time.toLocaleString('ja'), + link, + }); + } + + page += 1; + } + + ctx.state.data = { + title, + link, + description: title, + language: 'ja', + allowEmpty: true, + item: events, + }; +}; From fa88861177abb2b0f533a8563c10cd1c528188d0 Mon Sep 17 00:00:00 2001 From: KTachibanaM Date: Tue, 6 Oct 2020 20:21:16 -0700 Subject: [PATCH 2/4] extract eventernote event time --- lib/routes/eventernote/actors.js | 54 +++++++++++++++++++++++++------- 1 file changed, 43 insertions(+), 11 deletions(-) diff --git a/lib/routes/eventernote/actors.js b/lib/routes/eventernote/actors.js index 80e72767cc..2e89d00d94 100644 --- a/lib/routes/eventernote/actors.js +++ b/lib/routes/eventernote/actors.js @@ -1,7 +1,12 @@ const got = require('@/utils/got'); const cheerio = require('cheerio'); -const dateStringRegex = /(\d{4})-(\d{2})-(\d{2})/; +const dateStringRegex = /(?\d{4})-(?\d{2})-(?\d{2})/; +const timeStringRegexes = [ + /開場 (?\d{2}):(?\d{2}) 開演 (?\d{2}):(?\d{2}) 終演 (?\d{2}):(?\d{2})/, + /開場 - 開演 (?\d{2}):(?\d{2}) 終演 (?\d{2}):(?\d{2})/, + /開場 (?\d{2}):(?\d{2}) 開演 - 終演 (?\d{2}):(?\d{2})/, +]; module.exports = async (ctx) => { const { name, id } = ctx.params; @@ -32,26 +37,53 @@ module.exports = async (ctx) => { for (let i = 0; i < list.length; ++i) { const event = list[i]; - // extract event title - const title = $('div.event > h4 > a', event).text(); + // extract event name + const eventName = $('div.event > h4 > a', event).text(); // extract event location - const location = $('div.event > div.place > a', event).text(); + const eventLocation = $('div.event > div.place > a', event).text(); // extract event date const dateMatches = $('div.date > p', event).text().match(dateStringRegex); - const year = parseInt(dateMatches[1]); - const month = parseInt(dateMatches[2]); - const day = parseInt(dateMatches[3]); - const time = new Date(year, month, day); + 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, - description: location, - pubDate: time.toLocaleString('ja'), + title: eventName, + description: eventDescription, link, }); } From aae3cbcc0a8594a81b310f95328beb10a2be5dd5 Mon Sep 17 00:00:00 2001 From: KTachibanaM Date: Tue, 6 Oct 2020 23:17:02 -0700 Subject: [PATCH 3/4] add doc for eventernote --- docs/anime.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/anime.md b/docs/anime.md index 4398ddcfcb..cd2fc03ef8 100644 --- a/docs/anime.md +++ b/docs/anime.md @@ -136,6 +136,12 @@ pageClass: routes +## Eventernote + +### 声优活动及演唱会 + + + ## Hanime.tv ### 最近更新 From 5bdc2ada47737b9098d5647000d7cc5e279c1119 Mon Sep 17 00:00:00 2001 From: KTachibanaM Date: Tue, 6 Oct 2020 23:46:45 -0700 Subject: [PATCH 4/4] try smaller event count for eventernote for now --- lib/routes/eventernote/actors.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/routes/eventernote/actors.js b/lib/routes/eventernote/actors.js index 2e89d00d94..1c76df085a 100644 --- a/lib/routes/eventernote/actors.js +++ b/lib/routes/eventernote/actors.js @@ -8,17 +8,18 @@ const timeStringRegexes = [ /開場 (?\d{2}):(?\d{2}) 開演 - 終演 (?\d{2}):(?\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`; - let page = 1; const events = []; - // eslint-disable-next-line no-constant-condition - while (true) { - const pageLink = link + `?limit=100&page=${page}`; + 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',