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.1.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.indexOf("/posts/") > -1 && /\/posts\/(\d+)/.exec(links[l].href) != null)
{
var postID = /\/posts\/(\d+)/.exec(links[l].href)[1];
}
else if(links[l].href.indexOf("/post/show/") > -1 && /\/post\/show\/(\d+)(?:\/)?/.exec(links[l].href) != null)
{
var postID = /\/post\/show\/(\d+)(?:\/)?/.exec(links[l].href)[1];
}
else if(links[l].href.indexOf("/pools/") > -1 && /\/pools\/(\d+)/.exec(links[l].href) != null)
{
var poolID = /\/pools\/(\d+)/.exec(links[l].href)[1];
if(links[l].href.indexOf("?page=") > -1) continue;
if(links[l].href.indexOf("/edit") > -1) continue;
collectPool(links[l], poolID);
continue;
}
else continue;
if(window.location.href.indexOf(postID) > -1) continue;
if(!isNaN(postID)) appendPostRating(links[l],postID);
}
function appendPostRating(link,id)
{
var post = new XMLHttpRequest();
post.onload = function () {
if(post.status == 200)
{
var rating = post.response.rating;
var ratingReading = document.createElement("span");
ratingReading.innerHTML = " (rating: " + rating + ")";
link.parentNode.insertBefore(ratingReading, link.nextSibling);
}
}
post.open("GET", "/posts/" + id + ".json", true);
post.responseType = "json";
post.send();
}
function collectPool(link, id)
{
var postCount = new XMLHttpRequest();
postCount.onload = function () {
if(postCount.status == 200)
{
var pages = Math.ceil((postCount.response.post_count)/100);
var ratingReading = document.createElement("span");
ratingReading.innerHTML = " (loading...)";
link.parentNode.insertBefore(ratingReading, link.nextSibling);
var ratingCount = [0,0,0];
var searchCount = [];
for(var c = 0; c < pages; c++)
{
searchCount[c] = collectPosts(id,c + 1).then(function(response) {
for(var p = 0; p < response.length; p++)
{
switch (response[p].rating)
{
case "s":
ratingCount[0]++;
break;
case "q":
ratingCount[1]++;
break;
case "e":
ratingCount[2]++;
break;
}
}
});
}
Promise.all(searchCount).then(function() {
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)";
},function(reason) {
ratingReading.parentNode.removeChild(ratingReading);
});
}
}
postCount.open("GET", "/pools/" + id + ".json", true);
postCount.responseType = "json";
postCount.send();
}
function collectPosts(pool,page)
{
var promise = new Promise(function(resolve, reject) {
var search = new XMLHttpRequest();
search.onload = function () {
resolve(search.response);
}
search.onerror = function () {
reject("Connection failed");
}
search.open("GET", "/posts.json?tags=pool:" + pool + "&page=" + page + "&limit=100", true);
search.responseType = "json";
search.send();
});
return promise;
}
function FractionToPercentage(count, total)
{
return Math.round((count / total) * 100) + "%";
}