// ==UserScript== // @name Local SoundCloud Downloader // @namespace gjwse90gj98we // @version 1.4 // @description Download songs from SoundCloud // @author https://greasyfork.org/en/users/323851-gjwse90gj98we // @icon https://a-v2.sndcdn.com/assets/images/sc-icons/ios.png // @include /^https:\/\/soundcloud\.com/.*$/ // @require https://unpkg.com/file-saver@2.0.2/src/FileSaver.js // @grant none // @downloadURL https://update.greasyfork.icu/scripts/388255/Local%20SoundCloud%20Downloader.user.js // @updateURL https://update.greasyfork.icu/scripts/388255/Local%20SoundCloud%20Downloader.meta.js // ==/UserScript== (function() { "use strict"; var head = document.getElementsByTagName('head')[0]; var style = document.createElement('style'); var css = '.sc-button-directdl{text-indent:19px}.sc-button-directdl::before{background-size:16px 16px;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+UmVjdGFuZ2xlIDMxPC90aXRsZT48cGF0aCBkPSJNMyAxMXYyaDEwdi0ySDN6bTAtN2gxMGwtNSA2LTUtNnptMy0ydjJoNFYySDZ6IiBmaWxsPSIjMjIyIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz48L3N2Zz4=);content:"";display:block;position:absolute;background-repeat:no-repeat;background-position:center center;width:20px;height:20px;top:0;bottom:0;margin:auto 0;left:4px}'; style.setAttribute('type', 'text/css'); if (style.styleSheet) { style.styleSheet.cssText = css; } else { style.appendChild(document.createTextNode(css)); } head.appendChild(style); var currentdate = new Date(); currentdate.setDate(currentdate.getDate()); var deadline = new Date( localStorage.getItem( 'id_timestamp' ) ); if (localStorage.getItem("client_id") === null || currentdate >= deadline) { fetch('https://raw.githubusercontent.com/ytdl-org/youtube-dl/master/youtube_dl/extractor/soundcloud.py') .then(resp => { return resp.text(); }) .then(data => { var reg = /_CLIENT_ID = '([^']+)'/g var match = reg.exec(data); localStorage.setItem("client_id", match[1]); var newdate = new Date(); newdate.setDate(newdate.getDate() + 3); localStorage.setItem( 'id_timestamp', newdate ); }); } var sc_client_id = localStorage.getItem("client_id"); if (sc_client_id) { String.prototype.mapReplace = function(map) { var regex = []; for (var key in map) regex.push(key.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&")); return this.replace(new RegExp(regex.join("|"), "g"), function(word) { return map[word]; }); }; var last_sound_title = "1"; setInterval(function() { var sound_title = document .getElementsByClassName("soundTitle__title")[0] .children[0].innerText.mapReplace({ "&": "&", "<": "<", ">": ">", "'": "'", "/": "/", "`": "`", "=": "=", '"': """ }); if (last_sound_title !== sound_title) { last_sound_title = sound_title; var button_list = document.getElementsByClassName("sc-button-group sc-button-group-medium")[0]; fetch('https://api.soundcloud.com/resolve.json?client_id=' + sc_client_id + '&url=' + location.href) .then(i => { return i.json(); }) .then(data => { if (data.hasOwnProperty("stream_url")) { fetch(data.stream_url + '?client_id=' + sc_client_id).then( audio => { function dlFile() { saveAs(audio.url, data.title + '.mp3'); } var directdl = ''; var directlink = 'Direct link' button_list.insertAdjacentHTML('beforeend', directdl); button_list.insertAdjacentHTML('beforeend', directlink); document.getElementsByClassName("sc-button-directdl")[0].addEventListener ("click", dlFile, false); } ); } }); } if (document.getElementsByClassName("sound streamContext playing")[0] && !document.getElementsByClassName("sound streamContext playing")[0].querySelector(".sc-button-directdl")) { var stuff = document.getElementsByClassName("sound streamContext playing")[0]; var linksr = stuff.querySelector(".soundTitle__title.sc-link-dark").href; console.log(linksr); var button_list = stuff.querySelector(".sc-button-group.sc-button-group-small"); fetch('https://api.soundcloud.com/resolve.json?client_id=' + sc_client_id + '&url=' + linksr) .then(i => { return i.json(); }) .then(data => { if (data.hasOwnProperty("stream_url")) { fetch(data.stream_url + '?client_id=' + sc_client_id).then( audio => { function dlFile() { saveAs(audio.url, data.title + '.mp3'); } var directdl = ''; var directlink = 'Direct link' button_list.insertAdjacentHTML('beforeend', directdl); button_list.insertAdjacentHTML('beforeend', directlink); var divs = document.getElementsByClassName("sc-button-directdl"); var lastChild = divs[divs.length - 1]; lastChild.addEventListener ("click", dlFile, false); } ); } }); } }, 3 * 1000); } })();