UNPKG

cspanvideos

Version:

A small api for gathering video information from CSPAN for a particular legislator.

142 lines (140 loc) 16.7 kB
"use strict"; 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=