Newzbin Tools
By j20x6
—
Last update Jul 29, 2005
—
Installed
5,816 times.
// ==UserScript==
// @name Newzbin Tools
// @namespace http://blah.example/greasemonkeyscripts/
// @description Collection of enhancements to newzbin.com (v1.0.1)
// @include http://www.newzbin.com/*
// ==/UserScript==
(function() {
var prefs = [];
prefs["markRowAfterNZBDL"] = true;
prefs["rules"] = [
".nzbGet {display:block; float:right; font-size:xx-small;}",
".nzbGetLink {display:inline; cursor: pointer !important; color:#00008B !important; }",
".selectedRow {background-color:#6495ED !important;}",
".selectedRowWaiting {background-color:#494949 !important;}",
".linkCell {color:black; display:block; font-size:6pt}",
".loadingBox {display:block;position:absolute; background-color:grey; border: solid thin lightgrey;color:white;font-size: xx-small;text-align:center}",
".nfoBox {display:block; position:absolute; border: solid 2px black; background-color: black;}",
".nfoImageBox {display:block;height: 390px; overflow: auto; background-color: white; padding: 1px;}",
".nfoToolbar {font-size: xx-small;padding: 0px 1px 1px 1px;}",
".nfoToolbarItem {font-size: xx-small; color:lightgrey !important; display:inline; padding: 0px 3px 0px 3px; cursor: pointer;};"
];
prefs["linkProcessors"] = [
new LinkProcessor(/.*imdb\.com\/title\/tt.*/, /<b>(.*)\/10<\/b> \(.*votes\)/),
new LinkProcessor(/.*gamespot.com\/.*/, /<a href="review.html" class=".*score1">(.*)<br>/),
new LinkProcessor(/.*tv.com\/.*/, /^\s*\s{40}(\d{1,}\.\d)$/m),
new LinkProcessor(/.*ign.com\/.*/, /<div id="scoresBoxIgn".*(\d\.\d)<\/a><\/div>/),
new LinkProcessor(/.*teamxbox.com\/.*/, /staff_score_(\d\.\d)\.jpg/),
new LinkProcessor(/.*gamerankings.com\/.*/, /^(\d{2}%)$/m),
new LinkProcessor(/.*gamezone.com\/.*/,/\s*(\d\.\d)\s*<\/td>/m)
];
prefs["columns"] = [
new Column(3, processLinkCell, false),
new Column(4, processNfoCell, false),
new Column(6, processPostCell, false),
new Column(10, processBookmarkCell, false)
];
function processPage() {
var columns = prefs["columns"];
for (var i=0; i < columns.length; i++) {
var column = columns[i];
if (column.remove == false) {
processColumnCells(column.index, column.processor);
}
}
function processColumnCells(columnNumber, cellProcessor) {
var xpathQuery= "//div[@id='Content']/table[@class='dogresults']/tbody/tr[@class='new' or @class='odd' or @class='even']//td[" + columnNumber + "]/a";
var cells = evaluateXPath(unsafeWindow.document, xpathQuery);
for (var i=0; i < cells.length; i++) {
var cell = cells[i];
cellProcessor(cell);
}
}
}
function processBookmarkCell(cell) {
if (cell != undefined) {
cell.onclick = bookmarkClick;
}
function bookmarkClick(event) {
var url = this.href;
var rowNode = this.parentNode.parentNode;
if (prefs["markRowAfterNZBDL"]) {
markRow(rowNode, "selectedRowWaiting");
}
GM_xmlhttpRequest({
method: 'GET',
url: url,
headers: {'User-agent': 'Mozilla/4.0 (compatible) DN GM Script' },
onload: function(res){
if (prefs["markRowAfterNZBDL"] && res.status == 200) {
markRow(rowNode);
}
},
onerror: function(res) {alert(res.statusText);}
});
return false;
}
}
function processLinkCell(cell) {
//var aElement = cell.getElementsByTagName("A")[0];
var aElement = cell;
if (aElement != undefined ) {
var linkProcessors = prefs["linkProcessors"];
for (var i=0; i < linkProcessors.length; i++) {
if (linkProcessors[i].urlRegex.test(aElement.href)) {
aElement.onmouseover = linkProcessors[i].processor;
break;
}
}
}
}
function processNfoCell(cell) {
if (cell != undefined) {
cell.onclick = nfoClick;
}
function nfoClick(event) {
var url = this.href + "png/";
GM_xmlhttpRequest({
method: 'GET',
url: url,
headers: {'User-agent': 'Mozilla/4.0 (compatible) DN GM Script' },
onload: callback,
onerror: function(res) {alert(res.statusText);}
});
return false;
}
function callback(response) {
var regex = /<img src="(http:\/\/nfo.newzbin.com\/png\/\d{3,}.png)/
var imgUrl = regex.exec(response.responseText)[1];
//Main Box
var div = unsafeWindow.document.createElement("div");
div.className = "nfoBox";
div.style.top = findPosY(cell) + "px";
div.style.left = (findPosX(cell) - 20) + "px";
//Toolbar
var toolbarDiv = unsafeWindow.document.createElement("div");
toolbarDiv.className = "nfoToolbar";
//Close Link
var closeDiv = unsafeWindow.document.createElement("div");
closeDiv.className = "nfoToolbarItem";
closeDiv.onclick = function() {div.parentNode.removeChild(div);};
closeDiv.appendChild(unsafeWindow.document.createTextNode("[close]"));
//nfo Link
var linkA = unsafeWindow.document.createElement("a");
linkA.className = "nfoToolbarItem";
linkA.href = cell.href;
linkA.appendChild(unsafeWindow.document.createTextNode("[nfo page]"));
//Image Box
var imageDiv = unsafeWindow.document.createElement("div");
imageDiv.className = "nfoImageBox";
//Image
var img = unsafeWindow.document.createElement("img");
img.src = imgUrl;
//put it together...
toolbarDiv.appendChild(closeDiv);
toolbarDiv.appendChild(linkA);
imageDiv.appendChild(img);
div.appendChild(toolbarDiv);
div.appendChild(imageDiv);
unsafeWindow.document.body.appendChild(div);
}
}
function processPostCell(cell) {
cell.setAttribute("style", "display:block; float:left");
cell.parentNode.appendChild(createLinksNode(cell));
}
function createLinksNode(cell) {
var divElement = unsafeWindow.document.createElement("div");
divElement.className = "nzbGet";
//divElement.setAttribute("style", "display:block; float:right; font-size:xx-small"); //TODO replace with style
//'get' link
var getElement = unsafeWindow.document.createElement("a");
getElement.appendChild(unsafeWindow.document.createTextNode("get"));
getElement.className="nzbGetLink";
getElement.href = cell.href + "msgidlist";
if (prefs["markRowAfterNZBDL"]) getElement.onclick = function() {markRow(getElement.parentNode.parentNode.parentNode);};
//'w/o pars' link
var woParsElement = unsafeWindow.document.createElement("a");
woParsElement.appendChild(unsafeWindow.document.createTextNode("w/o pars"));
woParsElement.className="nzbGetLink";
woParsElement.onclick = woParsOnclickEventHandler;
divElement.appendChild(unsafeWindow.document.createTextNode("["));
divElement.appendChild(getElement);
divElement.appendChild(unsafeWindow.document.createTextNode(" :: "));
divElement.appendChild(woParsElement);
divElement.appendChild(unsafeWindow.document.createTextNode("]"));
return divElement;
}
const postRegexp = /.*post\/(\d{7})\/$/;
function woParsOnclickEventHandler(event) {
var sourceObject = this;
var aElement = sourceObject.parentNode.parentNode.getElementsByTagName("a")[0];
if (!postRegexp.test(aElement.href)) {
return;
}
var postID = postRegexp.exec(aElement.href)[1];
var parentObject = sourceObject.parentNode;
//Add loading div
var loadingDivElement = unsafeWindow.document.createElement("div");
var statusTextNode = unsafeWindow.document.createTextNode("loading...");
loadingDivElement.appendChild(statusTextNode);
loadingDivElement.id = "loading_" + postID;
loadingDivElement.className = "loadingBox";
loadingDivElement.style.top = findPosY(parentObject) + "px";
loadingDivElement.style.left = findPosX(parentObject) + "px";
loadingDivElement.style.width = parentObject.offsetWidth + "px";
loadingDivElement.style.height = parentObject.offsetHeight + "px";
unsafeWindow.document.body.appendChild(loadingDivElement);
if (prefs["markRowAfterNZBDL"]) markRow(sourceObject.parentNode.parentNode.parentNode, "selectedRowWaiting");
GM_xmlhttpRequest({
method: 'GET',
url: 'http://www.newzbin.com/browse/post/?ps_id='+postID,
headers: {
'User-agent': 'Mozilla/4.0 (compatible) DN GM Script'
},
onload: getCallbackFunction(postID),
onerror: function(res) {
alert(res.statusText);
}
});
function getCallbackFunction(postID) {
return function(res) {
var doc = res.responseText;
var noparregexp = /.*\.vol\d{1,}\+\d{1,}\.[pP][aA][rR]2.*/
var parser = new unsafeWindow.DOMParser();
var dom = parser.parseFromString(res.responseText, "application/xhtml+xml");
var rows = evaluateXPath(dom, "//html:form[@id='PostEdit']/html:table[@summary='Attached Files']/html:tr[@class='odd']");
var fids = new Array();
for (var i=0; i < rows.length; i++) {
var cells = rows[i].getElementsByTagName("td");
if (!noparregexp.test(cells[2].childNodes[0].nodeValue)) {
var fid = cells[0].getElementsByTagName("input")[0].getAttribute("name");
fids.push(fid);
}
}
//!!!!
var foobar = '<form action="http://www.newzbin.com/database/post/edit/?ps_id='+postID+'" method="post" id="submitme'+postID+'"><input type="hidden" name="msgidlist" value="Get+Message-IDs"/>';
for (var i = 0; i < fids.length; i++) {
foobar += '<input type="hidden" name="'+fids[i]+'" value="on"/>';
}
foobar += "</form>";
var range = unsafeWindow.document.createRange();
range.setStartAfter(unsafeWindow.document.body.lastChild);
var docFrag = range.createContextualFragment(foobar); // insert new fragment
unsafeWindow.document.body.appendChild(docFrag);
var fr = unsafeWindow.document.getElementById('submitme'+postID);
statusTextNode.nodeValue = "submiting...";
fr.submit();
fr.parentNode.removeChild(fr);
window.setTimeout(function(){unsafeWindow.document.body.removeChild(loadingDivElement);},1500+(fids.length*30));
if (prefs["markRowAfterNZBDL"]) markRow(sourceObject.parentNode.parentNode.parentNode);
};
}
}
function markRow(trElement, className) {
if (className == undefined) {
className = "selectedRow";
}
var cells = trElement.getElementsByTagName("td");
for (var i=0; i < cells.length; i++) {
cells[i].className=className;
}
}
function evaluateXPath(aNode, aExpr) {
//var xpe = new XPathEvaluator();
var nsResolver = function (prefix) { return 'http://www.w3.org/1999/xhtml';};
var result = unsafeWindow.document.evaluate(aExpr, aNode, nsResolver, XPathResult.UNORDERED_NODE_ITERATOR_TYPE , null);
var found = [];
while (res = result.iterateNext())
found.push(res);
return found;
}
function findPosX(obj) {
var curleft = 0;
var currentObject = obj;
if (currentObject.offsetParent) {
while (currentObject.offsetParent) {
curleft += currentObject.offsetLeft
currentObject = currentObject.offsetParent;
}
}
return curleft;
}
function findPosY(obj) {
var curtop = 0;
var currentObject = obj;
if (currentObject.offsetParent) {
while (currentObject.offsetParent) {
curtop += currentObject.offsetTop
currentObject = currentObject.offsetParent;
}
}
return curtop;
}
//Thanks Gmail Tweaks
function initializeStyles() {
var styleNode = unsafeWindow.document.createElement("style");
unsafeWindow.document.body.appendChild(styleNode);
styleSheet = unsafeWindow.document.styleSheets[unsafeWindow.document.styleSheets.length - 1];
var rules = prefs["rules"];
for (var i=0; i < rules.length; i++) {
styleSheet.insertRule(rules[i], 0);
}
}
function removeColumn(colNums) {
var cellsToRemove = [];
for (var i=0; i < colNums.length; i++) {
var colNum = colNums[i];
var cells = evaluateXPath(unsafeWindow.document, "//div[@id='Content']/table[@class='dogresults']/tbody/tr[@class='new' or @class='odd' or @class='even' or @class='header']/*["+colNum+"]");
for (var j=0; j < cells.length; j++) {
cellsToRemove.push(cells[j]);
}
}
for (var j=0; j < cellsToRemove.length; j++) {
cellsToRemove[j].parentNode.removeChild(cellsToRemove[j]);
}
}
/*
* Link Processor
*/
function LinkProcessor(urlRegex, pageRegex) {
this.urlRegex = urlRegex;
this.processor = function(event) {
var aElement = this;
aElement.onmouseover = undefined;
var callbackfunc = function(res) {
if (res.status == 200) {
var matches = pageRegex.exec(res.responseText);
var text;
if (matches != null) {
text = matches[1];
} else {
text = "??";
}
var divElement = unsafeWindow.document.createElement("div");
divElement.setAttribute("style", "color:black; display:block; font-size:xx-small");
divElement.appendChild(unsafeWindow.document.createTextNode(text));
aElement.parentNode.appendChild(divElement);
}
}
GM_xmlhttpRequest({
method: 'GET',
url: aElement.href,
headers: {
'User-agent': 'Mozilla/4.0 (compatible) DN GM Script'
},
onload: callbackfunc,
onerror: function(res) {
alert(res.statusText);
}
});
};
}
/*
* Column
*/
function Column(index, processor, remove) {
this.index = index;
this.processor = processor;
this.remove = remove;
}
initializeStyles();
window.setTimeout(processPage, 10);
})();