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);
}
});
}
