// ==UserScript== // @name Last.fm link to Metal Archives // @namespace https://github.com/Row/lastfm-userscripts // @description Creates a small M in front of each artist link on www.last.fm. The M's are linked to perform a band search on www.metal-archives.com // @version 2.0 // @include http://www.last.fm* // @include http://www.lastfm.* // @include http://cn.last.fm* // @downloadURL none // ==/UserScript== function addStyle(css) { var head, style; head = document.getElementsByTagName('head')[0]; if (!head) { return; } style = document.createElement('style'); style.type = 'text/css'; try { style.innerHTML = css; } catch(err) { style.innerText = css; } head.appendChild(style); } addStyle('.LMAa { font-size: 70% !important; display: inline}' + '.grid-items-item-aux-text>.LMAa, .countbar-bar-slug>.LMAa, .header-info-primary>.LMAa, .venn_title>LMAa, .chartlist-name>.LMAa {display:none}' ); function parser(doc) { //Create a node-list of all a-tags var nodeListA = doc.getElementsByTagName('a'); //Regular expression //Match /music/ and one or more characters which is not / var re = /\/music\/([^/#]+)$/i; var id; //Iterate through the node-list for (var i = 0; i < nodeListA.length; i++) { var artistLink = nodeListA[i]; //Check if current a-element has childnodes and that the firstchild is not an image //If so continue whit next iteration. if ((artistLink.className.search(/(LMA)/) > -1)) continue; //Match the href against the regular expression if (id = artistLink.href.match(re)) { // Filter var artist = id[1].replace(/\?.+$/, ''); //Use className as a marker artistLink.className += ' LMA'; //Create the M var metalLink = doc.createElement('a'); metalLink.href = 'http://www.metal-archives.com/search?type=band_name&searchString=' + artist; metalLink.className = 'LMAa'; metalLink.title = 'Search ' + artist + ' on Metal Archives'; if (artistLink.className.search(/featured-track-subtitle/) > -1) { metalLink.innerHTML = "Metal Archives"; metalLink.className += ' metadata-title'; artistLink.parentNode.insertBefore(metalLink, artistLink); } else { metalLink.innerHTML = 'M '; artistLink.parentNode.insertBefore(metalLink, artistLink); } //Since the nodelist is "live". i++; } } //Init the ticker ticker(doc,i); } //Method to check if the document has changed function ticker(doc,aCount) { //if there are new a-tags if(aCount != doc.getElementsByTagName('a').length) { parser(doc); return; } //Call the ticker again window.setTimeout(function() {ticker(doc,aCount);}, 1000); } parser(document);