您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Add OneClick Install for BeatSaber songs on ScoreSaber
- // ==UserScript==
- // @name ScoreSaber OneClick install button
- // @namespace https://github.com/Invertex/
- // @version 1.4
- // @description Add OneClick Install for BeatSaber songs on ScoreSaber
- // @author Invertex
- // @license GPL-3.0-or-later; http://www.gnu.org/licenses/gpl-3.0.txt
- // @match *://scoresaber.com/*
- // @require http://code.jquery.com/jquery-3.4.1.min.js
- // @grant GM.xmlHttpRequest
- // @connect beatsaver.com
- // ==/UserScript==
- const ocLabel = "OneClick™ Install";
- let styles = `
- .ocListButton {
- height: 3.1em;
- font-size: 0.6em;
- font-weight: 500;
- padding-top: 0px;
- padding-bottom: 0px;
- vertical-align: top;
- }
- .ocLoader {
- border: 0.4em solid #f3f3f3; /* Light grey */
- border-top: 0.4em solid #ffde1a; /* ScoreSaber Yellow */
- border-radius: 50%;
- width: 1.6em;
- height: 1.6em;
- animation: ocLoaderSpin 1s linear infinite;
- margin: auto;
- }
- @keyframes ocLoaderSpin {
- 0% { transform: rotate(0deg); }
- 100% { transform: rotate(360deg); }
- }`
- var styleSheet = document.createElement("style")
- styleSheet.type = "text/css"
- styleSheet.innerText = styles
- document.head.appendChild(styleSheet);
- (function() {
- 'use strict';
- let location = window.location.href;
- if(location.includes("leaderboard"))
- {
- let songInfoElem = document.querySelector("html body div.section div.container div.content div.columns.is-desktop.is-flex-reverse div.column.is-one-third-desktop div.box.has-shadow");
- let boldElems = songInfoElem.getElementsByTagName("B");
- if(boldElems.length > 0)
- {
- let songIDElem = boldElems[boldElems.length - 1];
- GetOneClickLink(songIDElem.innerText, songIDElem, SetupOneClickButton);
- }
- }
- else //Not leaderboard, check if song listings and if so add download buttons on each
- {
- let songList = document.querySelector("div.ranking.songs table.ranking.songs tbody");
- if(songList != null)
- {
- let songs = songList.getElementsByTagName("tr");
- for(var i = 0; i < songs.length; i++)
- {
- ProcessSongListEntry(songs[i]);
- }
- }
- }
- })();
- function DownloadSong(songUrl)
- {
- window.location = songUrl;
- }
- function SwapElementVisibility(elem1, elem2)
- {
- let vis1 = elem1.style.display;
- elem1.style.display = elem2.style.display;
- elem2.style.display = vis1;
- }
- function ProcessSongListEntry(songElem)
- {
- let songID = songElem.querySelector("td.song img").src;
- songID = songID.substr(songID.lastIndexOf('/') + 1, 40);
- let starElem = songElem.querySelector("td.stars");
- let column = document.createElement("td");
- let button = document.createElement("button");
- let loader = document.createElement("div");
- button.innerText = ocLabel;
- button.className = "ocListButton";
- loader.className = "ocLoader";
- loader.style.display = "none";
- column.appendChild(button);
- column.appendChild(loader);
- songElem.appendChild(column);
- button.addEventListener("click",
- function()
- {
- GetOneClickLink(songID,
- starElem,
- DownloadSong,
- function() { SwapElementVisibility(button, loader); },
- function() { SwapElementVisibility(button, loader); },
- )
- }, false);
- }
- function GetOneClickLink(songID, modifyElement, onLoadResponse, onStartFunction, onFinishFunction)
- {
- if(onStartFunction != null) { onStartFunction();}
- GM.xmlHttpRequest({
- method: "GET",
- url: "https://beatsaver.com/api/search/text/0?q=" + songID,
- responseType: "json",
- headers: { "Content-type" : "application/json" },
- onload: function(e)
- {
- let results = e.response;
- if(results.totalDocs > 0)
- {
- var key = results.docs[0].key;
- onLoadResponse("beatsaver://" + key, modifyElement, key);
- if(onFinishFunction != null) { onFinishFunction() };
- }
- },
- onerror: function(e) { if(onFinishFunction) { onFinishFunction();} },
- onabort: function(e) { if(onFinishFunction) { onFinishFunction();} },
- ontimeout: function(e) { if(onFinishFunction) { onFinishFunction();} }
- });
- }
- function SetupOneClickButton(clickUrl, idElem, key)
- {
- var button = document.createElement("button");
- button.innerText = ocLabel;
- button.addEventListener("click", function() { DownloadSong(clickUrl) }, false);
- idElem.parentNode.appendChild(button);
- $(idElem).wrap("<a href='http://beatsaver.com/beatmap/" + key + "'></a>");
- }