mb. TAGGER LINKS NOW

By jesus2099 Last update Nov 6, 2012 — Installed 1,477 times.

There are 30 previous versions of this script.

// ==UserScript==
// @name           mb. TAGGER LINKS NOW
// @version        2012.1106.2230
// @description    musicbrainz.org: Quickly show or update "TAGGER" links with desired port
// @namespace      http://userscripts.org/scripts/show/88065
// @author         Tristan DANIEL (PATATE12 aka. jesus2099/shamo)
// @licence        CC BY-NC-SA 3.0 FR (http://creativecommons.org/licenses/by-nc-sa/3.0/fr/)
// @grant          none
// @match          *://*.musicbrainz.org/*
// @run-at         document-end
// ==/UserScript==
if(self.location.href.match(/^https?:\/\/([^.]+\.)?musicbrainz\.org\/.*$/)){/*@matchopera*/(function(){"use strict";
	var userjs = "jesus2099userjs88065";
	var classic = self.location.href.match(/\/\/classic\.mu/i);
	var MBS = self.location.protocol+"//"+self.location.host;
	/* ----- - ----- CONFIG */
	var automatic = true; /*will background load tport (only when none) so TAGGER buttons do appear on next page browsing without bother triggering it manually*/
	var tagger_port = "8000";/*first time default only (then using remembered setting)*/
	var url = "/search"+(classic?"/textsearch.html":"")+"?type=label&query="+userjs+"&tport=%tagger-port%";
	var txt_notaggerlinks = "%tagger-img% (%tagger-port%)"; /* %tagger-port% variable shows the current port and %tagger-img% the tagger image */
	var txt_taggerlinksloaded = "%tagger-img% (%tagger-port%)";
	var txt_loading = "\u231b\u00a0loading\u2026";
	var bgcolour = "#6f9";
	var taggerImgUrl = MBS+"/static/images/icons/mblookup-tagger.png"; /*replaces %tagger-img% in txt and chgtxt*/
	/* ----- - END OF CONFIG */
	var RE_GUID = "[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}";
	var portStorage = userjs+"_tport";
	var iframename = classic?"hiddeniframe":"tagger-iframe";
	var taggerlinks = hasIframe(document, iframename);
	var con, a, menu, taggerlink;
	if (localStorage) {
		var savedport = localStorage.getItem(portStorage);
		if (savedport) { tagger_port = savedport; }
	}
	if (taggerlinks && (taggerlink = document.querySelector("a[target='"+iframename+"']"))) {
		var tport = taggerlink.getAttribute("href");
		if (tport) {
			tport = tport.match(/^https?:\/\/[^/]+:([0-9]+)\//);
			if (tport) {
				tagger_port = tport[1];
				if (savedport && tagger_port != savedport && localStorage) { localStorage.setItem(portStorage, tagger_port); }
			}
		}
	}
	if (menu = document.querySelector("table#mainmenu-table table tr, div#header-menu ul")) {
		a = document.createElement("a");
		var wtxt = (taggerlinks?txt_taggerlinksloaded:txt_notaggerlinks).replace(/%tagger-port%/, tagger_port);
		var wfrg = document.createDocumentFragment();
		var warr = wtxt.split("%tagger-img%");
		if (warr.length > 1) {
			wfrg.appendChild(document.createTextNode(warr[0]));
			var img = document.createElement("img");
			img.setAttribute("src", taggerImgUrl);
			img.setAttribute("alt", "tagger");
			img.style.setProperty("vertical-align", "bottom");
			wfrg.appendChild(img);
			wfrg.appendChild(document.createTextNode(warr[1]));
		}
		else {
			wfrg.appendChild(document.createTextNode(wtxt));
		}
		a.appendChild(wfrg);
		a.style.setProperty("cursor", "pointer");
		a.setAttribute("title", (!taggerlinks?"CTRL+":"")+"CLICK to change port (currently on port "+tagger_port+")");
		a.addEventListener("click", function(e) {
				if (e.ctrlKey || taggerlinks) {
					var tport = window.prompt("CHANGE TAGGER PORT\n\nCurrent tagger port is "+tagger_port+".\nEnter new tagger port below:", tagger_port);
					if (!tport || (tport == tagger_port && taggerlinks)) {
						return false;
					}
					else {
						tagger_port = tport;
						localStorage.setItem(portStorage, tport);
					}
				}
				loadu(e, false);
			}, false);
		if (classic) {
			a.style.setProperty("display", "block");
			a.style.setProperty("padding", "3px 7px");
			a.addEventListener("mouseover", function(e){this.style.setProperty("background-color","#77a");}, false);
			a.addEventListener("mouseout", function(e){this.style.removeProperty("background-color");}, false);
			con = document.createElement("td");
			con.style.setProperty("border-right", "none");
			con.style.setProperty("border-left", "solid black 1px");
			con.style.setProperty("padding", "0");
			menu.appendChild(con);
		} else {
			con = document.createElement("li");
			menu.insertBefore(con, menu.firstChild);
		}
		con.appendChild(a);
		if (!taggerlinks) { con.style.setProperty("background-color", bgcolour); }
		if (!taggerlinks && automatic) { loadu(null, true); }
	}
	function loadu(e, auto) {
		var autoreload = auto && !/(&|\?)tport=[0-9]+/.test(self.location.href) && (new RegExp("^"+MBS+"/(?:artist/"+RE_GUID+"/releases.*|cdtoc/.*|label/"+RE_GUID+"[^/].*|recording/"+RE_GUID+"(?!.+edits?).*|release/"+RE_GUID+"(?!.+edits?).*|release-group/"+RE_GUID+")$")).test(self.location.href);
		con.style.setProperty("opacity", ".5");
		if (autoreload || !auto) {
			removeChildren(a);
			a.appendChild(document.createTextNode(txt_loading));
		}
		var xhr = new XMLHttpRequest();
		xhr.onreadystatechange = function(e) {
			if (this.readyState == 4) {
				if (this.status < 400 && this.status > 199 && this.responseText.match(new RegExp("<iframe name=\""+iframename+"\""))) {
					if (auto && !autoreload) {
						con.style.setProperty("opacity", "1");
						con.style.removeProperty("background-color");
						a.setAttribute("title", a.getAttribute("title")+" \n \u261e AUTO-LOAD seems to have WORKED");
					} else {
						top.location.reload(true);
					}
				}
				else {
					con.style.setProperty("opacity", "1");
					con.style.setProperty("background-color", "gold");
					if (auto) {
						a.setAttribute("title", a.getAttribute("title")+" \n \u261e AUTO-LOAD seems to have FAILED");
					} else {
						removeChildren(a);
						a.appendChild(document.createTextNode("Error "+this.status+" (retry)"));
					}
				}
			}
		};
		xhr.open("get", url.replace(/%tagger-port%/, tagger_port), true);
		xhr.send(null);
	}
	function hasIframe(doc, frm) {
		var iframes = doc.getElementsByTagName("iframe");
		for (var fr=0; fr < iframes.length; fr++) {
			if (iframes[fr].getAttribute("name") == frm) return iframes[fr];
		}
		return null;
	}
	function removeChildren(p) {
		while (p && p.hasChildNodes()) { p.removeChild(p.firstChild); }
	}
})();}