Last.fm artist-wiki multilingualizer

By brtkrbzhnv Last update Mar 13, 2009 — Installed 176 times. Daily Installs: 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 2, 1, 1, 1, 3, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0

There are 2 previous versions of this script.

// ==UserScript==
// @name           Last.fm artist-wiki multilingualizer
// @namespace      http://www.google.com/search?q=brtkrbzhnv
// @description     Makes it easy to view an artist wiki in another language
// @include        http://www.last.fm/music/*
// @include        http://www.lastfm.*/music/*
// @include        http://cn.last.fm/music/*
// ==/UserScript==
// 2009-03-13 update: Restructured script & added loading-indicating thingie and automatic loading into cache

// format: url prefix, language code, whether to cache the wiki in that language on page load
var languages = new Array();
languages.push(["www.last.fm", "uk", false]);
languages.push(["www.lastfm.de", "de", false]);
languages.push(["www.lastfm.es", "es", false]);
languages.push(["www.lastfm.fr", "fr", false]);
languages.push(["www.lastfm.it", "it", false]);
languages.push(["www.lastfm.jp", "jp", false]);
languages.push(["www.lastfm.pl", "pl", false]);
languages.push(["www.lastfm.com.br","pt", false]);
languages.push(["www.lastfm.ru", "ru", false]);
languages.push(["www.lastfm.se", "se", false]);
languages.push(["www.lastfm.com.tr","tr", false]);
languages.push(["cn.last.fm","zh", false]);

var PREFIX = 0;
var CODE = 1;
var AUTOCACHE = 2;
var CACHE = 3;
var BUTTON = 4;


var loadimg = "data:image/gif;base64,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%3D%3D";

var artist, i, nativePrefix;
main();

function main() {
	if(!artistPage())  return;
	var url = xpath("/html/body/div[@id='page']/div/div[@id='content']/div[1]/div[@id='secondaryNavigation']/ul/li[1]/a").snapshotItem(0).href.split("/music/");
	artist  = url[1];
	nativePrefix = url[0].split("http://")[1];
	addButtons();
	preFetch();
}

function artistPage() {
	var rest = location.href.split("/")[5]; // That's undefined on the artist page.
	return rest?false:true;
}

function addButtons() {
	var buttonHolder = document.createElement("div");
	var wiki = xpath("/html/body/div[@id='page']/div/div[@id='content']/div[2]/div/div[@id='catalogueHead']/div[2]").snapshotItem(0);
	wiki.parentNode.insertBefore(buttonHolder, wiki);
	for(i = 0; language = languages[i]; ++i) {
		var button = document.createElement("img");
		button.flagsrc = button.src = "http://cdn.last.fm/depth/flags/mini/"+language[CODE]+".gif";
		button.id = language[CODE] +"WikiLanguageSwitch";
		language[BUTTON] = button;
		button.addEventListener("click",buttonFunction(language, button),false)
		buttonHolder.appendChild(button);
		buttonHolder.appendChild(document.createTextNode(" "));
	}
}

function buttonFunction(language) {
	return function (){
		if(language[CACHE]) x("//div[@id='wikiAbstract']").innerHTML = language[CACHE];
		else loadWiki(language, true);
	};
}

function preFetch() {
	language = languages.pop()
	if(! language) return;
	if(language[AUTOCACHE]) {
		loadWiki(language, false);
		window.setTimeout(preFetch, 1000);
	}
	else preFetch();
}

function loadWiki(language, replace) {
		language[BUTTON].src = loadimg;
		do_http_request("http://" + language[PREFIX] + "/music/" + artist + "/+wiki", callbackFunction(language, replace));
}

function callbackFunction(language, replace) {
return function(doc) {
		var foreignWiki = xpath2("//div[@id='wiki']", doc).snapshotItem(0);
		language[CACHE] = foreignWiki ? foreignWiki.innerHTML.replace(new RegExp(language[PREFIX], "g"), nativePrefix) : false;
		if(language[CACHE]) {
			if(replace) x("//div[@id='wikiAbstract']").innerHTML = language[CACHE];
		}
		else language[BUTTON].style.display = "none";
		language[BUTTON].src = language[BUTTON].flagsrc;
		};
}

function xpath2(query, doc) {
    return document.evaluate(query, doc, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
}

function x(query) {
	return xpath(query).snapshotItem(0);
}

// From Dive Into Greasemonkey:
function xpath(query) {
    return document.evaluate(query, document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
}

// From OiNKPlus: 
function do_http_request(url, callbackFunc){
	GM_xmlhttpRequest({
		method: "GET",
  url: url,
  onload: function(res) {
	  var result;
	  var range = document.createRange();
	  range.selectNode(document.body);
	  var parsedHTML = range.createContextualFragment(res.responseText);
	  result = document.createElement("div");
	  result.appendChild(parsedHTML);
	  callbackFunc(result);							
  }
	});
}