// ==UserScript== // @name SoundCloud Feed Control // @version 2.001 // @license MIT // @author nov0id // @description Filter by post, repost, and playlists for a better feed experience // @match *://soundcloud.com/feed // @grant none // @namespace https://rainbowlabllc.com/ // @downloadURL none // ==/UserScript== (function() { 'use strict'; // Function to get setting for the current tab function getTabSetting(key, defaultValue) { return sessionStorage.getItem(key) !== null ? JSON.parse(sessionStorage.getItem(key)) : defaultValue; } // Function to set setting for the current tab function setTabSetting(key, value) { sessionStorage.setItem(key, JSON.stringify(value)); } // Default settings per tab const settings = { filterPosts: getTabSetting('filterPosts', false), filterPlaylists: getTabSetting('filterPlaylists', false), filterReposts: getTabSetting('filterReposts', false) }; function createUI() { let panel = document.createElement('div'); panel.id = 'sc-filter-panel'; panel.innerHTML = `
Feed Filter
`; document.body.appendChild(panel); document.getElementById('filterPosts').addEventListener('change', () => toggleSetting('filterPosts')); document.getElementById('filterPlaylists').addEventListener('change', () => toggleSetting('filterPlaylists')); document.getElementById('filterReposts').addEventListener('change', () => toggleSetting('filterReposts')); } function toggleSetting(key) { settings[key] = !settings[key]; setTabSetting(key, settings[key]); // Store setting per tab filterFeed(); } function filterFeed() { document.querySelectorAll('.soundList__item').forEach((element) => { const context = element.querySelector('.sound.streamContext'); if (context) { let label = context.getAttribute('aria-label')?.toLowerCase(); if (label.includes('reposted') && settings.filterReposts) { element.remove(); } else if (label.includes('playlist') && settings.filterPlaylists) { element.remove(); } else if (!label.includes('playlist') && !label.includes('reposted') && settings.filterPosts) { element.remove(); } } }); } // Initialize UI and filter logic createUI(); filterFeed(); // Observe DOM for dynamically added elements const observer = new MutationObserver(filterFeed); observer.observe(document.body, { childList: true, subtree: true }); })();