twitter-expand-url
Version:
expand twitter urls based on API json
124 lines (94 loc) • 2.76 kB
JavaScript
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+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/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;