Pitchfork Review Score Scraper
Give an album name and get back the Pitchfork album review score.
author(s):
Luke Karrys
HTML
<h4>Query</h4>
<p>Artist: <span id="artist">wil</span></p>
<p>Album: <span id="album">yankee</span></p>
<hr/>
<h4>Result</h4>
<p>Artist: <span id="result_artist"></span></p>
<p>Album: <span id="result_album"></span></p>
<p>Score: <span id="score"></span></p>
JavaScript
(function($, undefined) {
function sanitize(str) {
return str.toLowerCase();
}
function normalizeP4kResult(result) {
var parts = result.split(' - '),
artist = parts[0],
album = parts[1];
return {
artist: sanitize(artist),
album: sanitize(album)
};
}
function returnResult(obj) {
return $.extend({
url: obj.url
}, normalizeP4kResult(obj.name));
}
function getAlbumUrl(data, textStatus, xhr) {
var searchData = data.value.items[0].json,
reviews = {},
theResult = {};
// Find the reviews object
for (var i = 0, m = searchData.length; i < m; i++) {
if (searchData[i].label.toLowerCase() === "reviews") {
reviews = searchData[i];
break;
}
}
if (!$.isEmptyObject(reviews) && !$.isEmptyObject(reviews.objects)) {
// We have results
reviews = (reviews.objects.length > 0) ? reviews.objects : [reviews.objects];
if (reviews.length === 1) {
// Only 1 result, use it
theResult = returnResult(reviews[0]);
} else {
for (var i = 0, m = reviews.length; i < m; i++) {
var p4kResult = normalizeP4kResult(reviews[i].name),
p4kArtist = p4kResult.artist,
p4kAlbum = p4kResult.album;
if ((p4kArtist === artist || artist === '') && (p4kAlbum === album || album === '')) {
// we found an exact match!
theResult = returnResult(reviews[i]);
break;
}
}
}
if ($.isEmptyObject(theResult)) {
// No exact match was found for the multiple results
// Might as well use pitchfork's top match
...