// ==UserScript==
// @name SoundCloud: Toggle Reposts
// @description Toggle the visibility of reposts on the stream and artists page.
// @version 2022.12.13
// @author garylaski
// @namespace https://github.com/garylaski/userscripts
// @match https://soundcloud.com/*
// @licence GPL-3.0-or-later; http://www.gnu.org/licenses/gpl-3.0.txt
// @run-at document-end
// @grant GM_getValue
// @grant GM_setValue
// @downloadURL https://update.greasyfork.icu/scripts/451339/SoundCloud%3A%20Toggle%20Reposts.user.js
// @updateURL https://update.greasyfork.icu/scripts/451339/SoundCloud%3A%20Toggle%20Reposts.meta.js
// ==/UserScript==
let streamSelector = '';
let buttonSelector = '';
let toggleButtonHandle = null;
function waitTillExists(selector, callback) {
new MutationObserver(function(mutations) {
let element = document.querySelector(selector);
if (element) {
this.disconnect();
callback(element);
}
}).observe(document, {subtree: true, childList: true});
}
function createButton(location) {
if (document.getElementById("toggleButtonHandle")) {
return;
}
location.innerHTML += `
`;
document.getElementById("toggleButton").addEventListener("click", toggle);
toggleButtonHandle = document.getElementById("toggleButtonHandle");
if(GM_getValue("showReposts")) {
toggleButtonHandle.classList.add("sc-toggle-on");
toggleButtonHandle.classList.add("sc-toggle-active");
toggleButtonHandle.classList.remove("sc-toggle-off");
}
}
function updateReposts(stream) {
for (const item of stream.querySelectorAll("li")) {
if (item.querySelector(".soundContext__repost,.soundTitle__info")) {
if (GM_getValue("showReposts")) {
item.style.display = "block";
} else {
item.style.display = "none";
}
}
}
}
function monitorStream(stream) {
new MutationObserver(function(mutations) {
updateReposts(stream);
}).observe(stream, {subtree: true, childList: true});
}
function toggle() {
if(GM_getValue("showReposts")) {
toggleButtonHandle.classList.remove("sc-toggle-on");
toggleButtonHandle.classList.remove("sc-toggle-active");
toggleButtonHandle.classList.add("sc-toggle-off");
GM_setValue("showReposts",false);
} else {
toggleButtonHandle.classList.remove("sc-toggle-off");
toggleButtonHandle.classList.add("sc-toggle-on");
toggleButtonHandle.classList.add("sc-toggle-active");
GM_setValue("showReposts",true);
}
updateReposts(document.querySelector(streamSelector));
}
let previousUrl = '';
const urlObserver = new MutationObserver(function(mutations) {
if (location.href !== previousUrl) {
previousUrl = location.href;
if (location.href == "https://soundcloud.com/feed") {
streamSelector = ".stream__list .lazyLoadingList ul";
buttonSelector = ".stream__header";
} else {
streamSelector = ".userStream__list ul";
buttonSelector = ".profileTabs";
}
waitTillExists(streamSelector, monitorStream);
waitTillExists(buttonSelector, createButton);
}
});
urlObserver.observe(document, {subtree: true, childList: true});