Created
April 6, 2016 21:17
-
-
Save caisah/d102cb4091112e1cdc394a32289cb890 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'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