diff options
| author | schneefux <schneefux+commit@schneefux.xyz> | 2018-05-02 10:46:09 +0200 |
|---|---|---|
| committer | schneefux <schneefux+commit@schneefux.xyz> | 2018-05-02 10:46:09 +0200 |
| commit | 56e56860fce961eaefdf90dcfb5c705c76426ac5 (patch) | |
| tree | b582404b697bde659e8f1e3031d7d434389264bf | |
| parent | 89dc57311e3a64086a4224b79015161080aef885 (diff) | |
| download | splus-56e56860fce961eaefdf90dcfb5c705c76426ac5.tar.gz splus-56e56860fce961eaefdf90dcfb5c705c76426ac5.zip | |
Fetch data for multiple weeks
| -rw-r--r-- | package-lock.json | 15 | ||||
| -rw-r--r-- | package.json | 2 | ||||
| -rw-r--r-- | src/config.ts | 2 | ||||
| -rw-r--r-- | src/index.ts | 23 |
4 files changed, 34 insertions, 8 deletions
diff --git a/package-lock.json b/package-lock.json index 025a544..88623ad 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,21 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@types/bluebird": { + "version": "3.5.20", + "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.20.tgz", + "integrity": "sha512-Wk41MVdF+cHBfVXj/ufUHJeO3BlIQr1McbHZANErMykaCWeDSZbH5erGjNBw2/3UlRdSxZbLfSuQTzFmPOYFsA==", + "dev": true + }, + "@types/bluebird-global": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/@types/bluebird-global/-/bluebird-global-3.5.5.tgz", + "integrity": "sha512-GkNTYT6dagBdgo1/SxY0b8afQb6NmPuh4tyyctSB8JCXQIswrOXJsnKvbavJIQ+sYCYI4WvcmMoM3GZnr0QArw==", + "dev": true, + "requires": { + "@types/bluebird": "3.5.20" + } + }, "@types/caseless": { "version": "0.12.1", "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.1.tgz", diff --git a/package.json b/package.json index a840bc3..3305dd4 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "start": "ts-node src/index.ts" }, "dependencies": { + "bluebird": "^3.5.1", "cheerio": "^1.0.0-rc.2", "googleapis": "^27.0.0", "ical-generator": "^0.2.10", @@ -17,6 +18,7 @@ "request-promise-native": "^1.0.5" }, "devDependencies": { + "@types/bluebird-global": "^3.5.5", "@types/cheerio": "^0.22.7", "@types/request": "^2.47.0", "@types/request-promise-native": "^1.0.14", diff --git a/src/config.ts b/src/config.ts index 77ab16e..a4f6691 100644 --- a/src/config.ts +++ b/src/config.ts @@ -6,6 +6,7 @@ import {IcalSink} from './sinks/IcalSink'; export interface SplusConfig { course: string; sink: ISink; + prefetchWeeks: number; lectureFilter?: ILectureFilter; } @@ -13,6 +14,7 @@ export interface SplusConfig { export const config: SplusConfig = { course: '#SPLUS7A3292', sink: new IcalSink('docs/informatik1.ics'), + prefetchWeeks: 4, lectureFilter: lecture => { // Filter some lectures out diff --git a/src/index.ts b/src/index.ts index 4fa7c20..ce1a70a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,29 +1,36 @@ import * as moment from 'moment'; +import * as BPromise from 'bluebird'; import {config} from './config'; import {SplusApi} from './core/SplusApi'; import {IEvent} from './core/IEvent'; +import {ILecture} from './core/ILecture'; -async function main() { +const flatten = (array) => [].concat(...array); +const range = (upper: number): number[] => Array.from(Array(upper), (x, i) => i) + +async function main(configCourse, configPrefetchWeeks, configFilter) { const baseDate = moment().startOf('week'); - const unfilteredLectures = await SplusApi.getData(config.course, baseDate.weeks()); - const lectures = unfilteredLectures.filter(config.lectureFilter); - for (let i = 0; i < lectures.length; i++) { - const lec = lectures[i]; + const unfilteredLectureChunks: ILecture[][] = await BPromise.map(range(configPrefetchWeeks), + async week => await SplusApi.getData(configCourse, baseDate.weeks() + week) + ); + const lectures: ILecture[] = flatten(unfilteredLectureChunks).filter(configFilter); + await BPromise.map(lectures, async (lec: ILecture, weeksAhead) => { let beginDate = baseDate.clone(); beginDate.add(moment.duration({ days: lec.day + 1, // for moment: 1 = Monday hours: lec.begin, + weeks: weeksAhead, })); let endDate = baseDate.clone(); endDate.add(moment.duration({ days: lec.day + 1, hours: lec.end, + weeks: weeksAhead, })); - const event: IEvent = { summary: lec.title, description: lec.lecturer + (lec.info !== '' ? ' - ' : '') + lec.info, @@ -35,9 +42,9 @@ async function main() { await config.sink.createEvent(event); console.log(lec.title, beginDate.toISOString(), endDate.toISOString()); - } + }); await config.sink.commit(); } -main(); +main(config.course, config.prefetchWeeks, config.lectureFilter).catch(console.log); |
