您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
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) + "%"; }