Vulcan/packages/telescope-post-by-feed/lib/server/fetch_feeds.js

103 lines
2.5 KiB
JavaScript
Raw Normal View History

2014-12-18 16:01:18 +09:00
var htmlParser = Npm.require('htmlparser2');
var toMarkdown = Npm.require('to-markdown').toMarkdown;
var he = Npm.require('he')
var getFirstAdminUser = function() {
return Meteor.users.findOne({isAdmin: true}, {sort: {createdAt: 1}});
}
var handleFeed = function(error, feed) {
if (error) return;
var feedItems = _.first(feed.items, 20); // limit feed to 20 items just in case
2015-01-14 12:31:09 +09:00
var userId = this._parser._options.userId;
2014-12-18 16:01:18 +09:00
2014-12-18 18:07:04 +09:00
clog('// Parsing RSS feed: '+ feed.title)
2014-12-18 16:01:18 +09:00
var newItemsCount = 0;
feedItems.forEach(function(item, index, array) {
// if item has no id, use the URL to give it one
if (!item.id)
item.id = item.link;
2014-12-18 16:01:18 +09:00
// check if post already exists
if (!!Posts.findOne({feedItemId: item.id})) {
2014-12-18 18:07:04 +09:00
// clog('// Feed item already imported')
2014-12-18 16:01:18 +09:00
} else {
newItemsCount++;
var post = {
2015-01-06 11:55:12 +09:00
title: he.decode(item.title),
2014-12-18 16:01:18 +09:00
url: item.link,
feedId: feed.id,
feedItemId: item.id,
2015-01-14 12:31:09 +09:00
userId: userId
2014-12-18 16:01:18 +09:00
}
2015-01-06 11:55:12 +09:00
if (item.description)
post.body = toMarkdown(he.decode(item.description));
2015-01-14 12:31:09 +09:00
// console.log(feed)
2015-01-05 10:01:57 +09:00
// if RSS item link is a 301 or 302 redirect, follow the redirect
var get = HTTP.get(item.link, {followRedirects: false});
2015-01-05 10:01:57 +09:00
if (!!get.statusCode && (get.statusCode === 301 || get.statusCode === 302) && !!get.headers && !!get.headers.location) {
post.url = get.headers.location;
}
// if RSS item has a date, use it
2015-01-04 12:51:30 +09:00
if (item.pubDate)
post.postedAt = moment(item.pubDate).toDate();
2014-12-18 16:01:18 +09:00
try {
submitPost(post);
} catch (error) {
// catch errors so they don't stop the loop
2014-12-18 18:07:04 +09:00
clog(error);
2014-12-18 16:01:18 +09:00
}
}
});
clog('// Found ' + newItemsCount + ' new feed items')
};
fetchFeeds = function() {
var content;
Feeds.find().forEach(function(feed) {
2015-01-14 12:31:09 +09:00
// if feed doesn't specify a user, default to admin
var userId = !!feed.userId ? feed.userId : getFirstAdminUser()._id;
2014-12-18 16:01:18 +09:00
try {
2015-01-06 11:55:12 +09:00
2014-12-18 16:01:18 +09:00
content = HTTP.get(feed.url).content;
2015-01-06 11:55:12 +09:00
var feedHandler = new htmlParser.FeedHandler(handleFeed);
2015-01-14 12:31:09 +09:00
var parser = new htmlParser.Parser(feedHandler, {xmlMode: true, userId: userId});
2015-01-06 11:55:12 +09:00
parser.write(content);
parser.end();
2014-12-18 16:01:18 +09:00
2015-01-06 11:55:12 +09:00
} catch (error) {
2014-12-18 16:01:18 +09:00
2015-01-06 11:55:12 +09:00
console.log(error);
return true; // just go to next url
}
2014-12-18 16:01:18 +09:00
});
}
Meteor.methods({
fetchFeeds: function () {
fetchFeeds();
},
testEntities: function (text) {
console.log(he.decode(text));
},
testToMarkdown: function (text) {
console.log(toMarkdown(text));
}
})