Skreemr batch search

By Bogdan Harjoc Last update May 29, 2009 — Installed 145 times.
// ==UserScript==
// @name          Skreemr batch search
// @namespace     http://patraulea.com/gm
// @description   Searches for a list of mp3s with skreemr
// @include       http://bug/skreemr/*
// @include       http://skreemr.com/*
// @include       */skreemrcfg.html
// ==/UserScript==

function byId(id) { return document.getElementById(id); }
function xpath(query) { return document.evaluate(query,
	document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); }
function getForm(name) { return document.forms.namedItem(name); }
function getElement(coll, name) { return coll.elements.namedItem(name); }
function trim(text) { return text
	.replace(/^[\n\r\t ]+/g , "")
	.replace( /[\n\r\t ]+$/g, "");
}

if (! byId("skreemr_cfg")) {
	var list, results, state, pos;
	var timer=false;
	
	function load() {
		listStr = GM_getValue("list", "")
			.replace(/\r/g, "")
			.replace(/\n+$/g, "")
			.replace(/\n\n+/g, "\n");
		list    = listStr.split("\n");

	    results = GM_getValue("results", "");
	    state   = GM_getValue("state", "0");
	    pos     = 1*GM_getValue("pos", "0");
	}
	
	function currentTrack() {
		var items = list[pos].split("\t");
		return items[0];
	}

	function currentQuery() {
		var items = list[pos].split("\t");
		var pair = items[2] + " " + items[3];
		return pair.replace(/[^a-zA-Z0-9 ]/g, " ");
	}

	function makeQuery() {
   		load();

		if (pos >= list.length) {
			alert("already finished");
			return false;
		}

		var query = currentQuery();
		GM_log("starting, pos=" + pos + " query=" + query);
		
		var sform = getForm("searchForm");
		getElement(sform, "q").value = query;

		GM_setValue("state", "1");
		sform.submit();
		
		return false;
	}

	function stop() {
		if (timer) {
			clearTimeout(timer);
			timer = false;
			alert("stop");
		}
		GM_setValue("state", "0");
		return false;
	}

	function cfg() {
		window.location = "http://patraulea.com/gm/skreemrcfg.html";
	}

	load();
		
	var nodes = xpath("//form[@name='searchForm']");
	if (nodes.snapshotLength == 1) {
		var form = nodes.snapshotItem(0);
		
		// init extra buttons
		var cmds = {"start":makeQuery, "stop":stop, "cfg":cfg};
		var first = true;
	
		for (cmd in cmds) {
			if (! first) {
				var span = document.createElement("span");
				span.innerHTML = "|";
				form.appendChild(span);
			}
			first = false;
	
			var a = document.createElement("a");
			a.innerHTML = cmd;
			a.addEventListener('click', cmds[cmd], false);
			form.appendChild(a);
		}
		
		// if started, collect result and schedule next query
		if (state == "1") {
			var query = getElement(getForm("searchForm"), "q").value;
			GM_log("query=" + query + " expecting=" + currentQuery());
			if (query == currentQuery()) {
				var links = xpath("//table[@class='resultbox']/tbody/tr/td/div/a[@rel='nofollow']");
				GM_log("#responses=" + links.snapshotLength);

				for (var l=0; l<links.snapshotLength; l++) {
					var a = links.snapshotItem(l);
					var href = a.href;
					var text = a.getElementsByTagName("span")[0].innerHTML;
					text = trim(text);

					GM_log("text=" + text + "\thref=" + href);
					results += [currentTrack(), text, href].join("\t") + "\n";
				}

				pos += 1;
				if (pos==list.length) {
					GM_log("finished");
					pos = 0;
					state = "0";
				}
				GM_log("new pos=" + pos);
				GM_setValue("pos", pos);
				GM_setValue("state", state);
				GM_setValue("results", results);

				if (state=="1") {
					var delay = Math.floor(10000 + 40000 * Math.random(Math.random()));
					GM_log("delay=" + delay);
					timer = setTimeout(makeQuery, delay);
				}
			}
		} else {
			GM_log("disabled, state=" + state);
		}
	}
} else {
	function fill() {
		byId("skreemr_results").innerHTML = GM_getValue("results", "");
		byId("skreemr_list").innerHTML    = GM_getValue("list", "");
		byId("skreemr_state").value       = GM_getValue("state", "");
		byId("skreemr_pos").value         = GM_getValue("pos", "");
	}

	function load() {
		var listStr = byId("skreemr_list").value;
		GM_setValue("list", listStr);
		GM_setValue("results", "");
		GM_setValue("state", "0");
		GM_setValue("pos", "0");
		
		fill();
		alert("list loaded; results, state and position reset");
		return false;
	}

	fill();
	byId("skreemr_load").addEventListener('click', load, false);

}