Finds links to posts on Danbooru and appends that post's rating to the end
当前为
// ==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) + "%";
}