// ==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 });
})();