113 lines
3.0 KiB
JavaScript
113 lines
3.0 KiB
JavaScript
let request = require ('request');
|
|
let Parser = require ('rss-parser');
|
|
let summarizer = require ('nodejs-text-summarizer');
|
|
var htmlToText = require ('html-to-text');
|
|
const constants = require ('../config/constants');
|
|
|
|
let parser = new Parser ();
|
|
|
|
getDataFromWPJSON = function (sourceUrl, page = 1, maxPosts = 10) {
|
|
return new Promise ((resolve, reject) => {
|
|
var options = {
|
|
method: 'GET',
|
|
url: `${sourceUrl}/wp-json/wp/v2/posts`,
|
|
qs: {
|
|
page: page,
|
|
per_page: maxPosts,
|
|
},
|
|
};
|
|
|
|
request (options, (error, response, body) => {
|
|
if (error) {
|
|
reject (error);
|
|
} else {
|
|
resolve (JSON.parse (body));
|
|
}
|
|
});
|
|
});
|
|
};
|
|
|
|
summarizeText = function (text, length, clearText = true) {
|
|
let preparedText = text;
|
|
if (clearText) {
|
|
preparedText = htmlToText.fromString (text, {
|
|
wordwrap: false,
|
|
ignoreHref: true,
|
|
ignoreImage: true,
|
|
});
|
|
}
|
|
|
|
return summarizer (preparedText, {n: length});
|
|
};
|
|
|
|
getTitlesFromWP = function (sourceUrl) {
|
|
return new Promise ((resolve, reject) => {
|
|
getDataFromWPJSON (sourceUrl)
|
|
.then (rawData => {
|
|
let result = '';
|
|
rawData.forEach (post => {
|
|
result +=
|
|
post.title.rendered +
|
|
`<break time="${constants.voiceResponseTimings.PAUSE_BETWEEN_TITLES}ms"/> `;
|
|
});
|
|
resolve (result);
|
|
})
|
|
.catch (err => {
|
|
reject (constants.voiceResponseStrings.ERROR_FETCHING_CONTENT);
|
|
});
|
|
});
|
|
};
|
|
|
|
getLatestNewsFromWP = function (
|
|
sourceUrl,
|
|
postCount = 10,
|
|
includeTitle = false
|
|
) {
|
|
return new Promise ((resolve, reject) => {
|
|
getDataFromWPJSON (sourceUrl, 1, postCount)
|
|
.then (rawData => {
|
|
let result = '';
|
|
let htmlToTextOptions = {
|
|
wordwrap: false,
|
|
ignoreHref: true,
|
|
ignoreImage: true,
|
|
};
|
|
|
|
try {
|
|
rawData.forEach (post => {
|
|
result += includeTitle ? post.title.rendered : '';
|
|
result += includeTitle
|
|
? `<break time="${constants.voiceResponseTimings.PAUSE_BETWEEN_TITLE_AND_CONTENT}ms"/>`
|
|
: '';
|
|
result += summarizeText (
|
|
post.content.rendered,
|
|
constants.FIXED_SUMMARY_LENGTH
|
|
);
|
|
result += `<break time="${constants.voiceResponseTimings.PAUSE_BETWEEN_NEWS}ms"/>`;
|
|
});
|
|
|
|
resolve (result);
|
|
} catch (err) {
|
|
reject (constants.voiceResponseStrings.ERROR_SUMMARIZING_CONTENT);
|
|
}
|
|
})
|
|
.catch (err => {
|
|
reject (constants.voiceResponseStrings.ERROR_FETCHING_CONTENT);
|
|
});
|
|
});
|
|
};
|
|
|
|
module.exports = {
|
|
getAnswerFromWP: function (sourceUrl, contentType) {
|
|
//This function will extract needed data from JSON, which we got from getDataFromWPJSON
|
|
switch (contentType) {
|
|
case constants.contentType.TITLES:
|
|
return getTitlesFromWP (sourceUrl);
|
|
break;
|
|
case constants.contentType.NEWS:
|
|
return getLatestNewsFromWP (sourceUrl);
|
|
break;
|
|
}
|
|
},
|
|
};
|