Danbooru Post Link Rating

Finds links to posts on Danbooru and appends that post's rating to the end

От 17.08.2016. Виж последната версия.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey, Greasemonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Userscripts.

За да инсталирате скрипта, трябва да инсталирате разширение като Tampermonkey.

За да инсталирате този скрипт, трябва да имате инсталиран скриптов мениджър.

(Вече имам скриптов мениджър, искам да го инсталирам!)

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

(Вече имам инсталиран мениджър на стиловете, искам да го инсталирам!)

// ==UserScript==
// @name          Danbooru Post Link Rating
// @namespace     DoomTay
// @description   Finds links to posts on Danbooru and appends that post's rating to the end
// @include       http://danbooru.donmai.us/*
// @include       https://danbooru.donmai.us/*
// @version       1.2.0

// ==/UserScript==

var links = document.links;

for(var l = 0; l < links.length; l++)
{
	if(links[l].firstChild.nodeName == "IMG") continue;
	if(document.getElementById("pool-nav") && document.getElementById("pool-nav").contains(links[l])) continue;
	if(links[l].href.includes("/posts/") && /\/posts\/(\d+)/.test(links[l].href))
	{
		var postID = /\/posts\/(\d+)/.exec(links[l].href)[1];
	}
	else if(links[l].href.includes("/post/show/") && /\/post\/show\/(\d+)(?:\/)?/.test(links[l].href))
	{
		var postID = /\/post\/show\/(\d+)(?:\/)?/.exec(links[l].href)[1];
	}
	else if(links[l].href.includes("/pools/") && /\/pools\/(\d+)/.test(links[l].href))
	{
		var poolID = /\/pools\/(\d+)/.exec(links[l].href)[1];
		if(links[l].href.includes("?page=")) continue;
		if(links[l].href.includes("/edit")) continue;
		collectPool(links[l], poolID);
		continue;
	}
	else continue;
	if(window.location.href.includes(postID)) continue;
	if(!isNaN(postID)) appendPostRating(links[l],postID);
}

function getJSON(url)
{
	var promise = new Promise(function(resolve, reject) {
		var request = new XMLHttpRequest();
		request.onload = function () {
			if(this.status == 200) resolve(this.response);
			else if(this.status == 421) reject("User Throttled");
			else reject(this.statusText);
		}
		request.onerror = function () {
			reject("Connection Failed");
		}
		request.open("GET", url, true);
		request.responseType = "json";
		request.send();
	});
	return promise;
}

function appendPostRating(link,id)
{
	getJSON("/posts/" + id + ".json").then(data =>
	{
		var rating = data.rating;
		var ratingReading = document.createElement("span");
		ratingReading.innerHTML = " (rating: " + rating + ")";
		link.parentNode.insertBefore(ratingReading, link.nextSibling);
	})
}

function collectPool(link, id)
{
	var ratingReading = document.createElement("span");
	ratingReading.innerHTML = " (loading...)";
	link.parentNode.insertBefore(ratingReading, link.nextSibling);
	
	getJSON("/pools/" + id + ".json").then(data =>
	{
		var pages = Math.ceil((data.post_count)/100);
		var searchCount = [];
		for(var c = 0; c < pages; c++)
		{
			searchCount[c] = getJSON("/posts.json?tags=pool:" + id + "&page=" + (c + 1) + "&limit=100");
		}
		Promise.all(searchCount).then((data) => {
			var ratingCount = [0,0,0];
			for(var d = 0; d < data.length; d++)
			{
				for(var p = 0; p < data[d].length; p++)
				{
					switch (data[d][p].rating)
					{
						case "s":
							ratingCount[0]++;
							break;
						case "q":
							ratingCount[1]++;
							break;
						case "e":
							ratingCount[2]++;
							break;
					}
				}
			}
			var total = ratingCount[0] + ratingCount[1] + ratingCount[2];
			ratingReading.innerHTML = " (" + FractionToPercentage(ratingCount[0],total) + " s, " + FractionToPercentage(ratingCount[1],total) + " q, " + FractionToPercentage(ratingCount[2],total) + " e)";
		},reason => {
			ratingReading.innerHTML = " (" + reason + ")";
		});
	},reason => {
		ratingReading.innerHTML = " (" + reason + ")";
	});
}

function FractionToPercentage(count, total)
{
	return Math.round((count / total) * 100) + "%";
}