UNPKG

twitter-expand-url

Version:
124 lines (94 loc) 2.76 kB
var domains = require("./data/domains.json"); var _ = require("lodash"); var expandURL = require("expand-url"); function TwitterExpandURL(){ this.amount = 0; this.done = 0; } function _isValid(url){ if(new RegExp("^(http|https)://t.co/").test(url)){ if(url.split("co/")[1].length === 10){ return true; } } return false; } function _isShortened(url){ for(var i = 0;i < domains.length;i++){ if(new RegExp("^(http|https)://" + domains[i]).test(url)){ return true; } } return false; } function _expand(params, cb){ params = params || {}; if(!params.url){ return cb(new Error("please provide a url to shorten")); } expandURL.expand(params.url, function(err, original){ return cb(null, {url: params.url, expanded_url: original}); }); } function _callback(err, result){ if(result){ this.done ++; this.results.push(result); } if(this.amount === this.done){ this.cb(null, this.id, this.results); } } TwitterExpandURL.prototype.expand = function(id, obj, params, cb){ this.cb = cb; this.id = id; this.results = []; params = params || {}; this.force = params.force || false; var regex = /(\b(https?):\/\/[-A-Z0-9+&amp;@#\/%?=~_|!:,.;]*[-A-Z0-9+&amp;@#\/%=~_|])/ig; var match = obj.text.match(regex); if(match){ var arr = _.merge(obj.entities.urls, obj.entities.media); this.amount = match.length; for(var i = 0;i < match.length;i++){ var shortURL = match[i]; if(_isValid(shortURL)){ var found = _.find(arr, {"url": shortURL}); if(found){ if(_isShortened(found.expanded_url) && this.force){ _expand.call(this, {url: found.expanded_url}, _callback.bind(this)); }else{ _callback.call(this, null, {url: shortURL, expanded_url: found.expanded_url}); } }else if(obj.retweeted_status){ var arr_rt = _.merge(obj.retweeted_status.entities.urls, obj.retweeted_status.entities.media); var found_rt = _.find(arr, {url: shortURL}); if(found_rt){ if(_isShortened(found.expanded_url) && this.force){ _expand.call(this, {url: shortURL}, _callback.bind(this)); }else{ _callback.call(this, null, {url: shortURL, expanded_url: found_rt.expanded_url}); } }else{ if(this.force){ _expand.call(this, {url: shortURL}, _callback.bind(this)); }else{ _callback.call(this, null, {url: shortURL, expanded_url: shortURL}); } } }else{ if(this.force){ _expand.call(this, {url: match[i]}, _callback.bind(this)); }else{ _callback.call(this, null, {url: match[i], expanded_url: match[i]}); } } }else{ _callback.call(this, null, {url: shortURL, expanded_url: ""}); } } }else{ cb(null, this.results); } }; module.exports = TwitterExpandURL;