// ==UserScript==
// @name SpotiKit
// @namespace http://tampermonkey.net/
// @version 7.0
// @description SpotiKIt — visual premium + AdBlocker for Spotify
// @author kit_fogos
// @match https://www.spotify.com/*/account/*
// @match https://open.spotify.com/*
// @match https://www.spotify.com/*/premium/*
// @match https://www.spotify.com/*/duo/*
// @match https://www.spotify.com/*/student/*
// @match https://www.spotify.com/*/family/*
// @match https://payments.spotify.com/*
// @grant GM_addStyle
// @run-at document-idle
// ==/UserScript==
(function() {
'use strict';
const PINK = '#FFD2D7';
const GREEN = '#1ed760';
GM_addStyle(`
.__sp_curr {
display:inline-block;
background:#535353;
color:#fff;
font-size:11px;
font-weight:700;
padding:3px 8px;
border-radius:3px;
text-transform:uppercase;
letter-spacing:.4px;
}
`);
const REPLACE = {
"Spotify Free": "Premium Individual",
"1 Free account": "1 Premium account",
"1 free account": "1 Premium account",
"Music with ads": "Listen to music ad-free",
"Music listening with ad breaks": "Listen to music ad-free",
"Shuffle play": "Play any song",
"Songs play in shuffle": "Play any song",
"Online only": "Download for offline listening",
"Streaming only": "Download for offline listening",
"No downloads": "Download for offline listening",
"Basic audio quality": "Very high audio quality",
"Normal audio quality": "Very high audio quality",
"Limited skips": "Unlimited skips",
"Free plan": "Premium Individual",
};
function run() {
const b = document.body;
if (!b) return;
const w = document.createTreeWalker(b, NodeFilter.SHOW_TEXT, null, false);
let n;
while (n = w.nextNode()) {
let v = n.nodeValue;
let c = false;
for (const [from, to] of Object.entries(REPLACE)) {
if (v.includes(from)) {
v = v.replaceAll(from, to);
c = true;
}
}
if (c) n.nodeValue = v;
}
document.querySelectorAll('.encore-text-title-medium, [class*="title-medium"]').forEach(el => {
if ((el.textContent || '').trim() === 'Premium Individual') {
el.style.color = window.location.href.includes('/subscription/manage/') ? '#000' : PINK;
const parent = el.closest('[class*="Hjkjj"], [class*="hjkjj"]');
if (parent) {
parent.style.background = PINK;
parent.style.color = '#000';
}
}
});
const planCard = document.querySelector('[data-testid="plan-card"]');
if (planCard && !planCard.querySelector('.__sp_logo')) {
planCard.style.position = 'relative';
const logo = document.createElement('img');
logo.className = '__sp_logo';
logo.src = 'https://i.ibb.co/jPMD5S3K/3-sin-t-tulo-20260704011012.png';
logo.style.cssText = 'position:absolute;top:8px;right:8px;width:24px;height:24px;z-index:10;pointer-events:none;';
planCard.appendChild(logo);
const msg = document.createElement('p');
msg.textContent = 'Your Premium Individual NEVER expires. Dont pay Spotify, fuck their monopoly!';
msg.style.cssText = 'color:#B3B3B3;font-size:14px;margin:8px 0;text-align:left;line-height:1.4;padding:0 4px;';
const btnRow = planCard.querySelector('[class*="dCZPlm"], .sc-3b07dd39-3');
if (btnRow) btnRow.parentNode.insertBefore(msg, btnRow);
}
document.querySelectorAll('h1, h2, h3, h4, strong, span, div[class*="plan"], div[class*="Plan"]').forEach(el => {
const t = (el.textContent || '').trim();
if (t === 'Free' || t === 'Spotify Free' || t === 'Free plan') {
el.textContent = 'Premium Individual';
el.style.color = PINK;
el.style.fontWeight = '700';
}
});
document.querySelectorAll('a, button, [role="button"]').forEach(el => {
const t = (el.innerText || el.textContent || '').trim().toLowerCase();
if (/^(get|buy|join|obtener|conseguir)\s*premium/.test(t)) {
el.textContent = 'DONT JOIN PREMIUM';
el.style.cssText += `background:${PINK}!important;color:#000!important;border:none!important;border-radius:20px!important;font-weight:700!important;pointer-events:none!important;cursor:default!important;`;
el.onclick = e => { e.preventDefault(); e.stopPropagation(); };
}
if (/^(explore|view|explorar|ver)\s*(plans|planes)/.test(t)) {
el.textContent = 'Manage plan';
el.style.cssText += `background:transparent!important;color:#fff!important;border:1px solid #727272!important;border-radius:20px!important;font-weight:700!important;pointer-events:none!important;cursor:default!important;`;
el.onclick = e => { e.preventDefault(); e.stopPropagation(); };
}
if (/^(try|pru[eé]ba)/.test(t)) el.style.display = 'none';
});
document.querySelectorAll('[class*="badge"], [class*="Badge"]').forEach(el => {
if (/^free$/i.test(el.textContent.trim())) {
el.textContent = 'PREMIUM';
el.style.background = PINK;
el.style.color = '#000';
}
});
document.querySelectorAll('table').forEach(tbl => {
tbl.querySelectorAll('td, th').forEach(cell => {
const t = cell.textContent.trim().toLowerCase();
if (!t || t === '—' || t === '-' || t === 'no' || /gratuito|free/.test(t)) {
cell.innerHTML = `✓`;
}
});
});
document.querySelectorAll('span[data-encore-id="text"]').forEach(el => {
const t = el.textContent.trim();
if (t === 'Download for offline listening' || t === 'Descarga canciones para disfrutarlas sin conexi\u00f3n' || t === 'Descarga canciones para disfrutarlas sin conexión') {
el.textContent = 'Spotify wont fuck you';
}
});
const upgradeBtn = document.querySelector('[data-testid="upgrade-button"]');
if (upgradeBtn) upgradeBtn.style.display = 'none';
const installBtn = document.querySelector('a[href="/download"]');
if (installBtn) installBtn.style.display = 'none';
const premiumMenu = document.querySelector('a[href*="premium/?ref=web_loggedin_upgrade_menu"]');
if (premiumMenu) premiumMenu.style.display = 'none';
const planesXpath = document.evaluate(
'//a[text()="Planes Premium"] | //span[text()="Planes Premium"] | //div[text()="Planes Premium"] | //a[text()="Premium Plans"] | //span[text()="Premium Plans"] | //div[text()="Premium Plans"]',
document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null
);
for (let i = 0; i < planesXpath.snapshotLength; i++) {
const n = planesXpath.snapshotItem(i);
if (n) n.style.display = 'none';
}
document.querySelectorAll('[aria-label*="Planes Premium"], [aria-label*="Premium Plans"], [data-ga-action="premium"], [data-ga-category="menu"] a, a[href*="/premium/"]').forEach(el => {
const t = el.textContent.trim();
if (t === 'Planes Premium' || t === 'Premium Plans') el.style.display = 'none';
});
const premiumBanner = document.querySelector('[data-testid="compact-banner"]');
if (premiumBanner) {
const wrapper = premiumBanner.closest('.sc-dad329a7-0, [class*="dad329a7"]');
if (wrapper) {
wrapper.style.width = '100%';
}
premiumBanner.style.cssText += `
display:flex !important;
flex-direction:row !important;
background:#2A2A2A !important;
cursor:default !important;
padding:0 !important;
border-radius:8px !important;
overflow:hidden !important;
min-width:unset !important;
width:100% !important;
`;
const left = document.createElement('div');
left.style.cssText = 'flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;row-gap:var(--encore-spacing-tighter-2);padding:var(--encore-spacing-looser) var(--encore-spacing-tighter-2);cursor:pointer;';
const pencilSvg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
pencilSvg.setAttribute('viewBox', '0 0 16 16');
pencilSvg.setAttribute('role', 'img');
pencilSvg.setAttribute('aria-hidden', 'true');
pencilSvg.style.cssText = 'width:var(--encore-graphic-size-decorative-base);height:var(--encore-graphic-size-decorative-base);';
pencilSvg.innerHTML = `
Dont give them a cent. Use Spotifuck for free.
Back to free Spotify `; main.innerHTML = ''; main.appendChild(wrapper); document.querySelectorAll('form, button[type="submit"], [data-testid*="pay"], [data-testid*="checkout"]').forEach(el => { el.onclick = e => { e.preventDefault(); e.stopPropagation(); }; }); } } setTimeout(run, 300); setTimeout(run, 1200); let timer; new MutationObserver(() => { clearTimeout(timer); timer = setTimeout(run, 400); }).observe(document.body, { childList: true, subtree: true }); })(); (async function() { 'use strict'; const removeElements = selector => { document.querySelectorAll(selector).forEach(el => el.remove()); }; const handleAudioAds = () => { const audioAd = document.querySelector('audio[src*="spotify.com/ad"]'); if (audioAd) { audioAd.src = ""; audioAd.pause(); } }; const inject = ({ ctx, fn, transform }) => { const original = ctx[fn]; ctx[fn] = function () { const result = original.apply(this, arguments); return transform ? transform.call(this, result, ...arguments) : result; }; }; const observer = new MutationObserver(() => { removeElements('[data-testid="ad-slot-container"], [class*="ad-"]'); handleAudioAds(); removeElements('.ButtonInner-sc-14ud5tc-0.fcsOIN'); }); observer.observe(document.body, { childList: true, subtree: true, }); const adRemovalInterval = setInterval(() => { removeElements('[data-testid="ad-slot-container"], [class*="ad-"]'); handleAudioAds(); removeElements('.ButtonInner-sc-14ud5tc-0.fcsOIN'); }, 1000); const queryAsync = (query, interval = 250) => new Promise(resolve => { const checkInterval = setInterval(() => { const element = document.querySelector(query); if (element) { clearInterval(checkInterval); resolve(element); } }, interval); }); const nowPlayingBar = await queryAsync(".now-playing-bar"); const playButton = await queryAsync("button[title=Play], button[title=Pause]"); let audio; inject({ ctx: document, fn: "createElement", transform(result, type) { if (type === "audio") { audio = result; } return result; }, }); new MutationObserver(() => { if (audio && playButton && document.querySelector(".now-playing > a")) { audio.src = ""; playButton.click(); } }).observe(nowPlayingBar, { childList: true, subtree: true, }); window.addEventListener('beforeunload', () => { observer.disconnect(); clearInterval(adRemovalInterval); }); })();