Skip to content

Instantly share code, notes, and snippets.

@caisah
Created April 6, 2016 21:17
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save caisah/d102cb4091112e1cdc394a32289cb890 to your computer and use it in GitHub Desktop.
Save caisah/d102cb4091112e1cdc394a32289cb890 to your computer and use it in GitHub Desktop.
'use strict';
var fs = require('fs');
var request = require('request');
var Q = require('q');
var cheerio = require('cheerio');
function parseListen(txt) {
return parseInt(txt.listens.replace(new RegExp(',', 'g'), ''), 10);
}
function readJson(name) {
var f = fs.readFileSync(name, 'utf-8');
return JSON.parse(f);
}
function createUrl(text) {
var textArr = text.split(' ');
return 'http://www.last.fm/search?q=' + textArr.join('+');
}
function getHtml(url) {
var deferred = Q.defer();
request(url, function(err, res, body) {
if (!err && res.statusCode === 200) {
deferred.resolve(body);
}
});
return deferred.promise;
}
function scrapeListens(html) {
var $ = cheerio.load(html);
var selected = $('p.grid-items-item-aux-text');
if (selected[0] &&
selected[0].children[0] &&
selected[0].children[0].data) {
return selected[0].children[0].data.trim();
}
return '0';
}
function sortByListens(arr) {
return arr.sort(function(a, b) {
var la = parseListen(a);
var lb = parseListen(b);
if (la < lb) {
return 1;
}
if (la > lb) {
return -1;
}
return 0;
});
}
function makeTable(arr) {
var str = arr.map(function(obj) {
return '|' + obj.name + '|' + obj.listens + '|\n';
}).join('');
return '|Band Name | Unique Listeners on last.fm|\n' +
'|---------|--------|\n' + str;
}
function writeTableFor(json) {
var outName = json.replace('json', 'md');
var names = readJson(json);
var urls = names.map(createUrl);
var promisesArr = urls.map(function(url) {
return getHtml(url)
.then(scrapeListens);
});
Q.all(promisesArr)
.then(function(listens) {
return listens.map(function(num, i) {
return {
name: names[i],
listens: num
};
});
})
.then(sortByListens)
.then(makeTable)
.then(function(txt) {
fs.writeFileSync(outName, txt);
console.log('done writing ', outName);
})
.fail(function(err) {
console.log(err);
});
}
writeTableFor('ec.json');
writeTableFor('untold.json');
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment