您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Add an OWNED tag to already downloaded beatmaps, 2 buttons to filter downloaded or not beatmap, page merger (up to 125 pages in the same window ! 5000 beatmaps continuously !)
当前为
// ==UserScript== // @name Osu downloaded Detector // @version 4.64 // @description Add an OWNED tag to already downloaded beatmaps, 2 buttons to filter downloaded or not beatmap, page merger (up to 125 pages in the same window ! 5000 beatmaps continuously !) // @author Aerath // @icon http://osu.ppy.sh/favicon.ico // @match https://osu.ppy.sh/p/beatmaplist* // @match http://osu.ppy.sh/p/beatmaplist* // @match https://osu.ppy.sh/s/* // @match http://osu.ppy.sh/s/* // @match https://osu.ppy.sh/b/* // @match http://osu.ppy.sh/b/* // @grant GM_setValue // @grant GM_getValue // @namespace https://greasyfork.org/users/14048 // ==/UserScript== if(window.location.pathname.startsWith("/s/") || window.location.pathname.startsWith("/b/")) { dl_url=document.getElementsByClassName("beatmap_download_link")[0].href.split('/') id=dl_url[dl_url.length-1]; var newtag = document.createElement("span"); newtag.innerHTML = "<strong style=\"display: inline-block;background: #dad7fb;border: solid 1px #cac7eb;border-radius: 2px;padding: 1px;margin-left: 10px;font-size: 75%;color:" + (contains(GM_getValue("ownedIDS", []), id) ? "red\">OWNED" : "green\">NEW"); document.getElementsByTagName("h1")[0].appendChild(newtag); audio.volume=GM_getValue("volume", 45)/100; } else { var optionHTML = '<script src="https://code.jquery.com/jquery-1.11.3.min.js"></script>'+ '<script src="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"></script>'+ '<a>Options</a>'+ '<div id="options" style="min-width:250px;display:none;">'+ ' <h3>Options</h3>'+ ' Volume : <span id="volume">45%</span><br><i>Automatically saved</i><br>'+ ' <input id="volumeInput" type="range" min="0" max="100" value="45" step="1"><br>'+ ' Pages to merge : '+ ' <input type="number" min="1" max="125" value="5" required="true" name="pageSpin" id="pageSpin" placeholder="Pages" style="width:25px;"><br>'+ ' <textarea name="idsArea" value=IDS id="idsArea" placeholder="IDs" style="width:85%;height:100px"></textarea><br>'+ ' <button>Save</button>'+ '</div>'; var buttonCSS = "background-color: rgb(169, 169, 255);color: rgb(255, 255, 255);cursor: pointer;display: inline;font-family: 'Arial Grande', Tahoma, Helvetica, Arial, sans-serif;font-size: 10.6666669845581px;height: auto;margin-right: 4px;padding-bottom: 3px;padding-left: 3px;padding-right: 3px;padding-top: 3px;text-decoration: none;width: auto;"; var textCSS = "color: #3843a6;cursor: pointer;display: inline;font-family: 'Arial Grande', Tahoma, Helvetica, Arial, sans-serif;font-size: 10.6666669845581px;height: auto;margin-right: 4px;padding-bottom: 3px;padding-left: 3px;padding-right: 3px;padding-top: 3px;text-decoration: none;width: auto;"; var page = getQueryVariable("page"); if(!page) page=1; else page = Number(page); var s1 = document.createElement("span"); var s2= document.createElement("span"); var s3= document.createElement("div"); s1.setAttribute("style", GM_getValue("show_owned", true) ? buttonCSS : textCSS); s2.setAttribute("style", GM_getValue("show_new", true) ? buttonCSS : textCSS); s1.addEventListener("click", click_owned, false); s2.addEventListener("click", click_new, false); s1.innerHTML = "OWNED"; s2.innerHTML = "NEW"; s3.innerHTML = optionHTML; s3.getElementsByTagName("a")[0].addEventListener("click", options, false); s3.getElementsByTagName("button")[0].addEventListener("click", optsave, false); document.getElementsByClassName("pagination")[0].appendChild(document.createElement("br")); document.getElementsByClassName("pagination")[0].appendChild(document.createElement("br")); document.getElementsByClassName("pagination")[0].appendChild(s1); document.getElementsByClassName("pagination")[0].appendChild(s2); document.getElementsByClassName("pagination")[0].appendChild(document.createElement("br")); document.getElementsByClassName("pagination")[0].appendChild(document.createElement("br")); document.getElementsByClassName("pagination")[0].appendChild(s3); document.getElementById("volumeInput").value = GM_getValue("volume", 45); document.getElementById("volumeInput").addEventListener("click", volume, false); document.getElementById("volumeInput").addEventListener("keydown", volume, false); document.getElementById("volumeInput").addEventListener("change", volume, false); // Disable first page play js (double declaration=> instant play-stop) $(".bmlistt").click( function() { $('.bmlistt>.icon-pause').removeClass("icon-pause").addClass("icon-play"); if (playBeatmapPreview($(this).parent().attr('id'))) $(this).find('i').removeClass("icon-play").addClass("icon-pause"); return false; } ); if(GM_getValue("merged_pages", 5) > 1) loadBMpage(1,GM_getValue("merged_pages", 5)-1); else editBMs(); } function options() { if(document.getElementById("options").getAttribute("style") == "min-width:250px;display:block;") document.getElementById("options").setAttribute("style", "min-width:250px;display:none;"); else { document.getElementById("pageSpin").value = GM_getValue("merged_pages", 5); document.getElementById("idsArea").innerHTML = GM_getValue("ownedIDS", []); document.getElementById("options").setAttribute("style", "min-width:250px;display:block;"); } } function optsave() { GM_setValue("ownedIDS", document.getElementById("idsArea").value.split(",")); GM_setValue("merged_pages", document.getElementById("pageSpin").value); document.getElementById("options").setAttribute("style", "min-width:250px;display:none;"); location.reload(); } function loadBMpage(increment,max_increment) { var xhr = createXHR(); xhr.onreadystatechange=function() { if(xhr.readyState == 4) { var storage = document.createElement("div"); storage.setAttribute("style", "display:none;"); document.getElementsByTagName("body")[0].appendChild(storage); storage.innerHTML = xhr.responseText; while(storage.getElementsByClassName("beatmapListing")[1].firstChild) document.getElementsByClassName("beatmapListing")[1].appendChild(storage.getElementsByClassName("beatmapListing")[1].firstChild); document.getElementsByTagName("body")[0].removeChild(storage); if(increment<max_increment) loadBMpage(increment+1,max_increment); else editBMs(); } }; xhr.open("GET", window.location.href+"&page="+(page+increment) , true); xhr.send(null); } function editBMs() { var bmlist = document.getElementsByClassName("beatmap"); for (var i = 0; i < bmlist.length; i++) { var bm = bmlist[i]; // Show Diffs and source like if hovered bm.children[3].children[1].className += '_'; bm.children[3].children[1].style.display = 'block'; bm.children[3].children[2].className += '_'; bm.children[3].children[2].style.display = 'block'; var id = bm.id; var tagdiv = bm.getElementsByClassName("tags")[0]; var newtag = document.createElement("a"); if(contains(GM_getValue("ownedIDS", []), id)) { if(!GM_getValue("show_owned", true)) bm.style.display = 'none'; newtag.innerHTML = "<p><strong style=\"color:red\">OWNED</strong></p>"; tagdiv.appendChild(newtag); } else { if(!GM_getValue("show_new", true)) bm.style.display = 'none'; newtag.innerHTML = "<p><strong style=\"color:green\">NEW</strong></p>"; tagdiv.appendChild(newtag); } } //reload ppy js: add various functions to inserted bm like audio //3rd decleration for first page bms => instant play-stop-play : everything is working now ! var pj = document.createElement("script"); pj.setAttribute("type", "text/javascript"); pj.setAttribute("src", "//s.ppy.sh/js/main.js?1436431322"); document.getElementsByTagName("body")[0].appendChild(pj); pj.addEventListener("load", volume, false); } function contains(a, obj) { for (var i = 0; i < a.length; i++) if (a[i] == obj) return true; return false; } function click_owned() { GM_setValue("show_owned", !GM_getValue("show_owned", true)); s1.setAttribute("style", GM_getValue("show_owned", true) ? buttonCSS : textCSS); hideShowBMs(); } function click_new() { GM_setValue("show_new", !GM_getValue("show_new", true)); s2.setAttribute("style", GM_getValue("show_new", true) ? buttonCSS : textCSS); hideShowBMs(); } function hideShowBMs() { var bmlist = document.getElementsByClassName("beatmap"); for (var i = 0; i < bmlist.length; i++) { var bm = bmlist[i]; var id = bm.id; if(contains(GM_getValue("ownedIDS", []), id)) bm.style.display = GM_getValue("show_owned", true) ? "inline-block" : "none"; else bm.style.display = GM_getValue("show_new", true) ? "inline-block" : "none"; } } function createXHR() { var request = false; try { request = new ActiveXObject('Msxml2.XMLHTTP'); } catch (err2) { try { request = new ActiveXObject('Microsoft.XMLHTTP'); } catch (err3) { try { request = new XMLHttpRequest(); } catch (err1) { request = false; } } } return request; } function getQueryVariable(variable) { var query = window.location.search.substring(1); var vars = query.split("&"); for (var i=0;i<vars.length;i++) { var pair = vars[i].split("="); if (pair[0] == variable) return pair[1]; } } function volume() { document.getElementById("volume").innerHTML=document.getElementById("volumeInput").value+"%"; audio.volume=document.getElementById("volumeInput").value/100; GM_setValue("volume", document.getElementById("volumeInput").value); }