您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Used for automatically downloading BeatStars content
- // ==UserScript==
- // @name BeatStars Downloader
- // @namespace BeatStarsDL
- // @match *://www.beatstars.com/*/tracks
- // @match *://beatstars.com/*/tracks
- // @grant none
- // @version 1.0
- // @author OliverP
- // @description Used for automatically downloading BeatStars content
- // @inject-into auto
- // ==/UserScript==
- /*
- -----------------------How to use-----------------------
- 1. Go into the tracks page of the user you want to download the tracks from
- 2. Click on "Load tracks" to load all available tracks of the user (the script is scrolling down automatically to do that)
- 3. Click on Download and wait until it completes
- 4. A modal will pop-up and allow you to copy the track names and the URLs (in a 2 line per track txt format)
- 5, Copy it into your downloader of choice or into the provided Python script
- --------------------------------------------------------
- */
- var my_css = '.modal{display:none;position:fixed;z-index:100000;left:0;top:0;width:100%;height:100%;overflow:auto;background-color:#000;background-color:rgba(0,0,0,0.4)}.modal-content{position:fixed;bottom:0;background-color:#fefefe;width:100%;-webkit-animation-name:slideIn;-webkit-animation-duration:.4s;animation-name:slideIn;animation-duration:.4s}.close{color:#fff;float:right;font-size:28px;font-weight:700}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer}.modal-header{padding:2px 16px;background-color:#5cb85c;color:#fff}.modal-body{padding:2px 16px}';
- var new_sty = document.createElement("style");
- new_sty.setAttribute("type", "text/css");
- new_sty.appendChild(document.createTextNode(my_css));
- document.body.appendChild(new_sty);
- document.body.innerHTML += '<div id="myModal" class="modal"><div class="modal-content"><div class="modal-header"><span class="close">×</span><h2>Download complete</h2></div><div class="modal-body"><p>Links:</p><textarea id="urllinks_dl" style="font-size: 9px;"></textarea><button id="copydl">Copy</button><span id="copyreport" style="color: green;"></span></div></div></div>';
- const checkElement = async selector => {
- while ( document.querySelector(selector) === null) {
- await new Promise( resolve => requestAnimationFrame(resolve) )
- }
- return document.querySelector(selector);
- };
- function sleepFor(sleepDuration){
- var now = new Date().getTime();
- while(new Date().getTime() < now + sleepDuration){ /* Do nothing */ }
- }
- function copyText(){ //For the URL copying
- var copyText = document.getElementById("urllinks_dl");
- var copyReport = document.getElementById("copyreport");
- copyText.select();
- copyText.setSelectionRange(0, 99999);
- navigator.clipboard.writeText(copyText.value);
- copyReport.innerHTML = "Successfully copied";
- }
- function download(fileName, fileType, text) {
- var blob = new Blob([text], { type: fileType });
- var a = document.createElement('a');
- a.download = fileName;
- a.href = URL.createObjectURL(blob);
- a.dataset.downloadurl = [fileType, a.download, a.href].join(':');
- a.style.display = "none";
- document.body.appendChild(a);
- a.click();
- document.body.removeChild(a);
- setTimeout(function() { URL.revokeObjectURL(a.href); }, 1500);
- }
- function preload(){ //Preloads tracks by scrolling until no more load
- (function scroll() {
- if(window.scrollY != window.scrollMaxY){
- window.scrollTo(0, document.body.scrollHeight || document.documentElement.scrollHeight);
- setTimeout(scroll, 1000);
- }else{
- document.body.scrollTop = document.documentElement.scrollTop = 0;
- }
- })();
- }
- function dlCheck(){ //Starts download
- checkElement('.btn-download').then((selector) => {
- var dlbtn_el = document.getElementsByClassName('btn-download');
- timer = 0;
- (function next() {
- if(dlbtn_el.length-1>timer) { //Until there are downloadable tracks
- console.log((timer+1)+"/"+(dlbtn_el.length-1))
- var musiccnt = document.getElementsByClassName("number ng-star-inserted"); var count = musiccnt.length; for(var i = 0; i < count; i++){ if(musiccnt[i].innerHTML.includes(timer)){ music = musiccnt[i]; } }
- list += "\n"+music.parentNode.parentNode.childNodes[2].children[0].children[0].innerHTML;
- do_download(dlbtn_el[timer], (timer+1), (dlbtn_el.length-1));
- list += "\n";
- timer += 1;
- setTimeout(next, 1000);
- }else{
- if(dlbtn_el.length-1 == timer){ //When the download is finished
- console.log(list);
- document.getElementById("urllinks_dl").innerHTML = list.trim();
- var modal = document.getElementById("myModal");
- modal.style.display = "block";
- }
- }
- })();
- });
- }
- async function do_download(item, timer, full_length){
- return new Promise((resolve,reject)=>{
- item.click();
- download(timer, full_length)
- resolve();
- });
- }
- list="" //This list will contain the download links
- async function download(timer, full_length){
- window.scrollTo(0, document.body.scrollHeight || document.documentElement.scrollHeight);
- await new Promise(r => setTimeout(r, 1000));
- var downloadbtn = document.getElementsByClassName("mat-button-wrapper"); var count = downloadbtn.length; for(var i = 0; i < count; i++){ if(downloadbtn[i].innerHTML.includes("Download")){ btn = downloadbtn[i]; } }
- list+=btn.closest('a').href; //Add download link to the list
- var closebtn = document.getElementsByClassName("mat-dialog-title"); var count = closebtn.length; for(var i = 0; i < count; i++){ if(closebtn[i].innerHTML.includes("Free Download")){ closebtn[i].innerHTML += " "+timer+"/"+full_length; btn1 = closebtn[i]; } }
- btn1.parentNode.childNodes[1].click();
- await new Promise(r => setTimeout(r, 3000));
- }
- window.addEventListener("DOMContentLoaded", function(event) { //Adds the buttons to the site
- checkElement('.title').then((selector) => {
- selector.innerHTML += "<button id='prlbtn'>Load tracks</button><button id='dlbtn'>Download</button>";
- var dlbtn = document.getElementById("dlbtn");
- dlbtn.onclick = function() {
- dlCheck();
- }
- var prlbtn = document.getElementById("prlbtn");
- prlbtn.onclick = function() {
- preload();
- }
- var copydl = document.getElementById("copydl");
- copydl.onclick = function() {
- copyText();
- }
- });
- });
- var modal = document.getElementById("myModal");
- var span = document.getElementsByClassName("close")[0];
- // When the user clicks on the close button, close the modal
- span.onclick = function() {
- modal.style.display = "none";
- }
- // When the user clicks anywhere outside of the modal, close it
- window.onclick = function(event) {
- if (event.target == modal) {
- modal.style.display = "none";
- }
- }