NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name Soundcloud - Add External Download Button // @namespace https://zachhardesty.com // @author Zach Hardesty <zachhardesty7@users.noreply.github.com> (https://github.com/zachhardesty7) // @description adds a button on main page and song page to download song automatically from https://soundcloudmp3.org/ // @copyright 2019, Zach Hardesty (https://zachhardesty.com/) // @license GPL-3.0-only; http://www.gnu.org/licenses/gpl-3.0.txt // @version 2.1.3 // @homepageURL https://github.com/zachhardesty7/tamper-monkey-scripts-collection/raw/master/soundcloud-download-button.user.js // @homepageURL https://openuserjs.org/scripts/zachhardesty7/Soundcloud_-_Add_External_Download_Button // @supportURL https://github.com/zachhardesty7/tamper-monkey-scripts-collection/issues // @updateURL https://openuserjs.org/meta/zachhardesty7/Soundcloud_-_Add_External_Download_Button.meta.js // @downloadURL https://openuserjs.org/src/scripts/zachhardesty7/Soundcloud_-_Add_External_Download_Button.user.js // @match https://soundcloud.com/* // @match https://loader.to/* // @require https://greasyfork.org/scripts/419640-onelementready/code/onElementReady.js?version=887637 // ==/UserScript== /* global onElementReady */ /** * adds button to soundcloud * * @param {HTMLElement} el - most recently added children (for lazy load) */ function addSoundcloudDownloadButton(el) { const link = window.location.href const button = document.createElement("button") button.textContent = "External Download" // if on soundcloud home and song node is not a playlist, append SC styled button if ( link.includes("stream") && !( /** @type {HTMLAnchorElement} */ ( el.querySelector(".soundTitle__title") ).href.includes("/sets/") ) ) { button.className = "mp3-button sc-button sc-button-small" el.querySelector(".soundActions .sc-button-group").append(button) // else if on individual song page (and not playlist), append SC styled button } else if ( !link.includes("stream") && (!link.includes("/sets/") || link.includes("?in=")) ) { const toolbar = document.querySelector(".soundActions div:first-child") button.className = "mp3-button sc-button sc-button-medium" toolbar.append(button) } el.querySelector(".mp3-button").addEventListener("click", () => { window.open( `https://loader.to/?link=${link}&f=1&s=1&e=1&r=ddownr`, "_blank" ) }) } // auto-run on soundcloud mp3 // if referred from soundcloud, grab data from GM storage // paste and submit to begin conversion to mp3 function mp3() { const { href } = window.location if (href.includes("loader.to")) { onElementReady( "#ds .card .section:last-of-type > progress", { findOnce: false }, (/** @type {HTMLProgressElement} */ progress) => { const timer = setInterval(() => { if (progress.value === 1000) { const button = document.querySelector( "#ds .card .section:last-of-type > a" ) button.click() clearInterval(timer) } }, 100) } ) } else { onElementReady( ".l-listen-wrapper", { findOnce: false }, addSoundcloudDownloadButton ) onElementReady( ".lazyLoadingList__list > .soundList__item", { findOnce: false }, addSoundcloudDownloadButton ) } } mp3()