cspanvideos
Version:
A small api for gathering video information from CSPAN for a particular legislator.
142 lines (140 loc) • 16.7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const request = require("request");
const cheerio = require("cheerio");
const chalk = require("chalk");
const _ = require("lodash");
const validUrl = require('valid-url');
const helpers_1 = require("./helpers");
class CSPANVideos {
constructor() {
this.CSPAN_BASE_URL = "https://www.c-span.org/person/?";
this.CSPAN_BAD_URL = "https://www.c-span.org/search/?searchtype=People&query=";
}
fetchVideoData(personName) {
const name = personName;
// if "name" is an error;
if (typeof name !== "string") {
console.error(chalk.bgRed("rejecting because name isn't a string"), name);
return;
}
return this._makeRequest(name)
.then(this._isBadURL)
.then((data) => {
return data
? this._makeSearchRequest(personName)
: this._makeRequest(name);
})
.then((data) => {
if (data instanceof Error) {
return Promise.reject(data);
}
/**
* If this string is present, then we are on
* the intended page.
*/
return data.indexOf('Recent Appearances') !== -1
? this._parseRequestForData(data)
: this._parseSearchPageForData(data);
})
.then((data) => {
return typeof data === "string"
? this._makeRequest(name, null, data)
: Promise.resolve(data);
})
.catch((err) => {
console.warn(chalk.magenta("There was an error, catch", err));
return err;
});
}
_isBadURL(dom) {
const $ = cheerio.load(dom);
return Promise.resolve($('body').html().indexOf("Page Not Found") > -1);
}
/**
* For when the url differs from the person's name
* like Ted Cruz being "rcruz."
*/
_makeSearchRequest(personName) {
if (!personName) {
return Promise.reject("Name not provided");
}
return this._makeRequest(personName, true);
}
_makeRequest(personName, badURL, newUrl) {
// Add try/catch?
if (!personName) {
return Promise.reject(new Error("No person name provided"));
}
const name = !badURL
? helpers_1.formatPersonName(personName)
: helpers_1.formatPersonName(personName, true);
const base_url = newUrl
? newUrl
: !badURL
? this.CSPAN_BASE_URL + name
: this.CSPAN_BAD_URL + personName.replace(/\s/, "+");
if (!name) {
return Promise.reject(name);
}
return new Promise((resolve, reject) => {
request(base_url, (err, response, body) => {
if (err) {
handleError(err);
reject(err);
}
else {
resolve(body);
}
});
});
}
_parseSearchPageForData(dom) {
const $ = cheerio.load(dom);
let properURL = $('section.bios > ul > li.indiv_bio > a.thumb')
.first()
.attr('href');
if (!properURL) {
return new Error("Bad name format provided");
}
if (_.startsWith(properURL, "//")) {
properURL = "https:" + properURL;
}
return properURL;
}
_parseRequestForData(dom) {
const $ = cheerio.load(dom);
const recentPrograms = [];
const recentProgramsHolder = $('ul.recent-programs > li');
for (var i = 0; i < recentProgramsHolder.length; i++) {
const singleVideo = {};
const container = recentProgramsHolder
.eq(i);
singleVideo.thumbnail = container
.find('a.thumb > img')
.attr("src");
singleVideo.title = container
.find('div.text > a.title > h3')
.text();
singleVideo.date = container
.find("div.text > span.time > time")
.text();
singleVideo.video_url = container
.find("a.thumb")
.attr("href");
singleVideo.embed_url = helpers_1.formatEmbedURL(singleVideo.video_url);
recentPrograms.push(singleVideo);
}
return recentPrograms;
}
}
function handleError(err) {
console.error("There was an error: ", err);
}
const cspanvideos = new CSPANVideos();
exports.cspanvideos = cspanvideos;
/**
* TODO: Cache request info from search page to cut down
* on number of requests.
*/
//# sourceMappingURL=data:application/json;charset=utf8;base64,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RUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRVQsV0FBVyxDQUFDLFNBQVMsR0FBRyxTQUFTO2lCQUM5QixJQUFJLENBQUMsZUFBZSxDQUFDO2lCQUNyQixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFZixXQUFXLENBQUMsS0FBSyxHQUFHLFNBQVM7aUJBQzFCLElBQUksQ0FBQyx5QkFBeUIsQ0FBQztpQkFDL0IsSUFBSSxFQUFFLENBQUM7WUFFVixXQUFXLENBQUMsSUFBSSxHQUFHLFNBQVM7aUJBQ3pCLElBQUksQ0FBQyw2QkFBNkIsQ0FBQztpQkFDbkMsSUFBSSxFQUFFLENBQUM7WUFFVixXQUFXLENBQUMsU0FBUyxHQUFHLFNBQVM7aUJBQzlCLElBQUksQ0FBQyxTQUFTLENBQUM7aUJBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRWhCLFdBQVcsQ0FBQyxTQUFTLEdBQUcsd0JBQWMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFOUQsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNuQyxDQUFDO1FBRUQsTUFBTSxDQUFDLGNBQWMsQ0FBQztJQUN4QixDQUFDO0NBQ0Y7QUFFRCxxQkFBcUIsR0FBVTtJQUM3QixPQUFPLENBQUMsS0FBSyxDQUFDLHNCQUFzQixFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzdDLENBQUM7QUFFRCxNQUFNLFdBQVcsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0FBQzdCLGtDQUFXO0FBVXBCOzs7R0FHRyIsImZpbGUiOiJzcmMvY3NwYW52aWRlb3MuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyByZXF1ZXN0IGZyb20gJ3JlcXVlc3QnO1xuaW1wb3J0ICogYXMgY2hlZXJpbyBmcm9tICdjaGVlcmlvJztcbmltcG9ydCAqIGFzIGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcblxuY29uc3QgdmFsaWRVcmwgPSByZXF1aXJlKCd2YWxpZC11cmwnKTtcblxuaW1wb3J0IHsgZm9ybWF0UGVyc29uTmFtZSwgZm9ybWF0RW1iZWRVUkwgfSBmcm9tICcuL2hlbHBlcnMnO1xuXG5jbGFzcyBDU1BBTlZpZGVvcyB7XG4gIENTUEFOX0JBU0VfVVJMOiBzdHJpbmcgPSBcImh0dHBzOi8vd3d3LmMtc3Bhbi5vcmcvcGVyc29uLz9cIjtcbiAgQ1NQQU5fQkFEX1VSTDogc3RyaW5nID0gXCJodHRwczovL3d3dy5jLXNwYW4ub3JnL3NlYXJjaC8/c2VhcmNodHlwZT1QZW9wbGUmcXVlcnk9XCI7XG5cblxuICBmZXRjaFZpZGVvRGF0YShwZXJzb25OYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBuYW1lID0gcGVyc29uTmFtZTtcblxuICAgIC8vIGlmIFwibmFtZVwiIGlzIGFuIGVycm9yO1xuICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5iZ1JlZChcInJlamVjdGluZyBiZWNhdXNlIG5hbWUgaXNuJ3QgYSBzdHJpbmdcIiksIG5hbWUpXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX21ha2VSZXF1ZXN0KG5hbWUpXG4gICAgICAudGhlbih0aGlzLl9pc0JhZFVSTClcbiAgICAgIC50aGVuKChkYXRhKSA9PiB7XG4gICAgICAgIHJldHVybiBkYXRhXG4gICAgICAgICAgPyB0aGlzLl9tYWtlU2VhcmNoUmVxdWVzdChwZXJzb25OYW1lKVxuICAgICAgICAgIDogdGhpcy5fbWFrZVJlcXVlc3QobmFtZSlcbiAgICAgIH0pXG4gICAgICAudGhlbigoZGF0YSkgPT4ge1xuXG4gICAgICAgIGlmICggZGF0YSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJZiB0aGlzIHN0cmluZyBpcyBwcmVzZW50LCB0aGVuIHdlIGFyZSBvblxuICAgICAgICAgKiB0aGUgaW50ZW5kZWQgcGFnZS5cbiAgICAgICAgICovXG4gICAgICAgIHJldHVybiBkYXRhLmluZGV4T2YoJ1JlY2VudCBBcHBlYXJhbmNlcycpICE9PSAtMVxuICAgICAgICAgID8gdGhpcy5fcGFyc2VSZXF1ZXN0Rm9yRGF0YShkYXRhKVxuICAgICAgICAgIDogdGhpcy5fcGFyc2VTZWFyY2hQYWdlRm9yRGF0YShkYXRhKVxuICAgICAgfSlcbiAgICAgIC50aGVuKChkYXRhKSA9PiB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgID8gdGhpcy5fbWFrZVJlcXVlc3QobmFtZSwgbnVsbCwgZGF0YSlcbiAgICAgICAgICA6IFByb21pc2UucmVzb2x2ZShkYXRhKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICBjb25zb2xlLndhcm4oY2hhbGsubWFnZW50YShcIlRoZXJlIHdhcyBhbiBlcnJvciwgY2F0Y2hcIiwgZXJyKSlcbiAgICAgICAgcmV0dXJuIGVycjtcbiAgICAgIH0pXG4gICAgICBcbiAgfVxuXG4gIF9pc0JhZFVSTChkb206IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoZG9tKTtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCQoJ2JvZHknKS5odG1sKCkuaW5kZXhPZihcIlBhZ2UgTm90IEZvdW5kXCIpID4gLTEpXG4gIH1cblxuICAvKipcbiAgICogRm9yIHdoZW4gdGhlIHVybCBkaWZmZXJzIGZyb20gdGhlIHBlcnNvbidzIG5hbWVcbiAgICogbGlrZSBUZWQgQ3J1eiBiZWluZyBcInJjcnV6LlwiXG4gICAqL1xuICBfbWFrZVNlYXJjaFJlcXVlc3QocGVyc29uTmFtZTogc3RyaW5nKTogYW55IHtcbiAgICBpZiAoICFwZXJzb25OYW1lICkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFwiTmFtZSBub3QgcHJvdmlkZWRcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX21ha2VSZXF1ZXN0KHBlcnNvbk5hbWUsIHRydWUpO1xuICB9XG5cbiAgX21ha2VSZXF1ZXN0KHBlcnNvbk5hbWU6IHN0cmluZywgYmFkVVJMPzogYm9vbGVhbiwgbmV3VXJsPykge1xuICAgIFxuICAgIC8vIEFkZCB0cnkvY2F0Y2g/XG4gICAgaWYgKCAhcGVyc29uTmFtZSApIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBwZXJzb24gbmFtZSBwcm92aWRlZFwiKSk7XG4gICAgfSBcblxuICAgIGNvbnN0IG5hbWUgPSAhYmFkVVJMXG4gICAgPyBmb3JtYXRQZXJzb25OYW1lKHBlcnNvbk5hbWUpXG4gICAgOiBmb3JtYXRQZXJzb25OYW1lKHBlcnNvbk5hbWUsIHRydWUpXG4gICAgXG4gICAgY29uc3QgYmFzZV91cmwgPSBuZXdVcmwgXG4gICAgPyBuZXdVcmwgXG4gICAgOiAhYmFkVVJMXG4gICAgICA/IHRoaXMuQ1NQQU5fQkFTRV9VUkwgKyBuYW1lXG4gICAgICA6IHRoaXMuQ1NQQU5fQkFEX1VSTCArIHBlcnNvbk5hbWUucmVwbGFjZSgvXFxzLyxcIitcIik7XG5cbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuYW1lKVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICByZXF1ZXN0KGJhc2VfdXJsICwgKGVycjogRXJyb3IsIHJlc3BvbnNlOiByZXF1ZXN0LlJlcXVlc3RSZXNwb25zZSwgYm9keTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICBoYW5kbGVFcnJvcihlcnIpO1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUoYm9keSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIFxuICBfcGFyc2VTZWFyY2hQYWdlRm9yRGF0YShkb206IHN0cmluZykge1xuICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoZG9tKTtcbiAgICBsZXQgcHJvcGVyVVJMID0gJCgnc2VjdGlvbi5iaW9zID4gdWwgPiBsaS5pbmRpdl9iaW8gPiBhLnRodW1iJylcbiAgICAgIC5maXJzdCgpXG4gICAgICAuYXR0cignaHJlZicpO1xuXG4gICAgaWYgKCAhcHJvcGVyVVJMICkge1xuICAgICAgcmV0dXJuIG5ldyBFcnJvcihcIkJhZCBuYW1lIGZvcm1hdCBwcm92aWRlZFwiKVxuICAgIH1cblxuICAgIGlmICggXy5zdGFydHNXaXRoKHByb3BlclVSTCwgXCIvL1wiKSkge1xuICAgICAgcHJvcGVyVVJMID0gXCJodHRwczpcIiArIHByb3BlclVSTDtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvcGVyVVJMO1xuICB9XG5cbiAgX3BhcnNlUmVxdWVzdEZvckRhdGEoZG9tOiBzdHJpbmcpIHtcbiAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGRvbSk7XG4gICAgY29uc3QgcmVjZW50UHJvZ3JhbXM6IElTaW5nbGVWaWRlb1tdID0gW107XG4gICAgY29uc3QgcmVjZW50UHJvZ3JhbXNIb2xkZXIgPSAkKCd1bC5yZWNlbnQtcHJvZ3JhbXMgPiBsaScpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZWNlbnRQcm9ncmFtc0hvbGRlci5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgc2luZ2xlVmlkZW86IElTaW5nbGVWaWRlbyA9IHt9O1xuXG4gICAgICBjb25zdCBjb250YWluZXIgPSByZWNlbnRQcm9ncmFtc0hvbGRlclxuICAgICAgICAuZXEoaSk7XG5cbiAgICAgIHNpbmdsZVZpZGVvLnRodW1ibmFpbCA9IGNvbnRhaW5lclxuICAgICAgICAuZmluZCgnYS50aHVtYiA+IGltZycpXG4gICAgICAgIC5hdHRyKFwic3JjXCIpO1xuXG4gICAgICBzaW5nbGVWaWRlby50aXRsZSA9IGNvbnRhaW5lclxuICAgICAgICAuZmluZCgnZGl2LnRleHQgPiBhLnRpdGxlID4gaDMnKVxuICAgICAgICAudGV4dCgpO1xuXG4gICAgICBzaW5nbGVWaWRlby5kYXRlID0gY29udGFpbmVyXG4gICAgICAgIC5maW5kKFwiZGl2LnRleHQgPiBzcGFuLnRpbWUgPiB0aW1lXCIpXG4gICAgICAgIC50ZXh0KCk7XG5cbiAgICAgIHNpbmdsZVZpZGVvLnZpZGVvX3VybCA9IGNvbnRhaW5lclxuICAgICAgICAuZmluZChcImEudGh1bWJcIilcbiAgICAgICAgLmF0dHIoXCJocmVmXCIpO1xuXG4gICAgICBzaW5nbGVWaWRlby5lbWJlZF91cmwgPSBmb3JtYXRFbWJlZFVSTChzaW5nbGVWaWRlby52aWRlb191cmwpO1xuXG4gICAgICByZWNlbnRQcm9ncmFtcy5wdXNoKHNpbmdsZVZpZGVvKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVjZW50UHJvZ3JhbXM7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlRXJyb3IoZXJyOiBFcnJvcikge1xuICBjb25zb2xlLmVycm9yKFwiVGhlcmUgd2FzIGFuIGVycm9yOiBcIiwgZXJyKTtcbn1cblxuY29uc3QgY3NwYW52aWRlb3MgPSBuZXcgQ1NQQU5WaWRlb3MoKTtcbmV4cG9ydCB7IGNzcGFudmlkZW9zIH07XG5cbmludGVyZmFjZSBJU2luZ2xlVmlkZW8ge1xuICB0aHVtYm5haWw/OiBzdHJpbmcsXG4gIHRpdGxlPzogc3RyaW5nLFxuICBkYXRlPzogc3RyaW5nLFxuICBlbWJlZF91cmw/OiBzdHJpbmcsXG4gIHZpZGVvX3VybD86IHN0cmluZ1xufVxuXG4vKipcbiAqIFRPRE86IENhY2hlIHJlcXVlc3QgaW5mbyBmcm9tIHNlYXJjaCBwYWdlIHRvIGN1dCBkb3duXG4gKiBvbiBudW1iZXIgb2YgcmVxdWVzdHMuXG4gKi8iXX0=