This repository has been archived by the owner on May 1, 2023. It is now read-only.
/
feedHelper.js
111 lines (98 loc) · 4.17 KB
/
feedHelper.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
const FeedParser = require('feedparser');
const fs = require('fs');
const entities = require('html-entities').AllHtmlEntities;
const request = require('request');
const striptags = require('striptags');
const config = require('./configuration');
const constants = require('./constants');
const logHelper = require('./logHelper');
const s3Helper = require('./s3Helper');
const feedParser = function () {
return {
getFeed : function (category, fileName, callback) {
let url = config.feeds[category];
let req = request(url);
let feedparser = new FeedParser(null);
let items = [];
req.on('response', function (res) {
let stream = this;
if (res.statusCode === 200) {
stream.pipe(feedparser);
} else {
return stream.emit('error', new Error('Bad status code'));
}
});
req.on('error', function (err) {
return callback(err, null);
});
// Received stream. parse through the stream and create JSON Objects for each item
feedparser.on('readable', function() {
let stream = this;
let item;
while (item = stream.read()) {
let feedItem = {};
// Process feedItem item and push it to items data if it exists
if (item['title'] && item['date']) {
feedItem['title'] = item['title'];
feedItem['title'] = entities.decode(striptags(feedItem['title']));
feedItem['title'] = feedItem['title'].trim();
feedItem['title'] = feedItem['title'].replace(/[&]/g,'and').replace(/[<>]/g,'');
feedItem['date'] = new Date(item['date']).toUTCString();
if (item['description']) {
feedItem['description'] = item['description'];
feedItem['description'] = entities.decode(striptags(feedItem['description']));
feedItem['description'] = feedItem['description'].trim();
feedItem['description'] = feedItem['description'].replace(/[&]/g,'and').replace(/[<>]/g,'');
}
if (item['link']) {
feedItem['link'] = item['link'];
}
if (item['image'] && item['image'].url) {
feedItem['imageUrl'] = item['image'].url;
}
items.push(feedItem);
}
}
});
// All items parsed. Store items in S3 and return items
feedparser.on('end', function () {
let count = 0;
items.sort(function (a, b) {
return new Date(b.date) - new Date(a.date);
});
items.forEach(function (feedItem) {
feedItem['count'] = count++;
});
stringifyFeeds(items, (feedData) => {
s3Helper.putObject(fileName, feedData, function (err, data) {
if (err) {
callback(err, data);
} else {
data.items = items;
callback(err, data);
}
});
});
});
feedparser.on('error', function(err) {
callback(err, null);
});
},
stringifyItems : function (items, callback) {
stringifyFeeds(items, function (feedData) {
callback(feedData);
})
}
};
}();
function stringifyFeeds(items, callback) {
// Structure items before storing into S3 file.
let feedData = '[';
for (let i = 0; i < items.length; i++) {
feedData += JSON.stringify(items[i]) + ', ';
}
let dataLength = feedData.length;
feedData = feedData.substring(0, dataLength-2) + ']';
callback(feedData);
}
module.exports = feedParser;