Vacía tu lista de «Vídeos que me gustan» y quita cada «me gusta» en bloque. Gratis, en tu navegador.
// Responsive Muse · Unlike All YouTube Videos · v1.1 · 2026-10-22
// Removes every video from your Liked videos list, which also removes your like.
// Runs only on youtube.com/playlist?list=LL. It counts first and asks before changing anything,
// then clicks the same "Remove from Liked videos" menu you would. It makes no network requests
// of its own and never reads cookies, passwords or tokens.
(async () => {
const TOOL = 'Quitar todos los «me gusta»';
const LIMIT = 0; // stop after this many videos (0 = no limit)
const DELAY = 700; // pause between actions, in milliseconds
if (location.hostname !== 'www.youtube.com' || new URLSearchParams(location.search).get('list') !== 'LL') {
alert('Open your Liked videos first (signed in):\nhttps://www.youtube.com/playlist?list=LL');
return;
}
// A small box on the page shows progress and asks before changing anything,
// so you never need to read or edit the console.
const many = (n, word) => `${n} ${n === 1 ? word : ({ canal: 'canales', 'canción': 'canciones', 'publicación': 'publicaciones', 'elemento guardado': 'elementos guardados' })[word] || word + 's'}`; // 1 vídeo, 2 vídeos
const panel = (() => {
const box = document.createElement('div');
box.style.cssText = 'position:fixed;right:16px;bottom:16px;z-index:2147483647;width:340px;max-width:calc(100vw - 32px);' +
'background:#111318;color:#e6e8ee;font:14px/1.5 system-ui,sans-serif;border-radius:12px;padding:16px;' +
'box-shadow:0 8px 30px rgba(0,0,0,.4);text-align:left';
const head = document.createElement('strong');
head.textContent = TOOL;
const msg = document.createElement('p');
msg.style.cssText = 'margin:8px 0 12px;white-space:pre-line';
const row = document.createElement('div');
row.style.cssText = 'display:flex;flex-wrap:wrap;gap:8px;justify-content:flex-end';
box.append(head, msg, row);
document.body.append(box);
const button = (label, primary, onClick) => {
const b = document.createElement('button');
b.textContent = label;
b.style.cssText = 'font:600 14px system-ui,sans-serif;padding:8px 14px;border-radius:8px;cursor:pointer;' +
(primary ? 'background:#0f766e;color:#fff;border:1px solid #0f766e' : 'background:none;color:#e6e8ee;border:1px solid #3a3f4b');
b.onclick = onClick;
row.append(b);
};
return {
text(t) { msg.textContent = t; },
ask(t, yes) {
msg.textContent = t;
row.replaceChildren();
return new Promise(r => {
button('Cancelar', false, () => { row.replaceChildren(); r(false); });
button(yes, true, () => { row.replaceChildren(); r(true); });
});
},
stoppable(onStop) { row.replaceChildren(); button('Parar', false, onStop); },
actions(t, list) {
msg.textContent = t;
row.replaceChildren();
list.forEach(([label, primary, run]) => button(label, primary, run));
},
finish(t) { this.actions(t, [['Cerrar', true, () => box.remove()]]); },
close() { box.remove(); },
};
})();
const sleep = ms => new Promise(r => setTimeout(r, ms));
// Wait until something shows up on screen (menus can take a moment to open)
const visible = e => e.getClientRects().length > 0;
const waitFor = async (find, ms = 4000) => {
for (let t = 0; t < ms; t += 150) {
const hit = find();
if (hit) return hit;
await sleep(150);
}
return null;
};
// "Remove from Liked videos" in English, Spanish, Portuguese, French, German and Italian
const REMOVE = /remove from liked videos|quitar de videos que me gustan|remover de vídeos marcados como "gostei"|retirer des vidéos .*j'aime|aus .*mag ich.* entfernen|rimuovi da video piaciuti/i;
const rows = () => [...document.querySelectorAll('yt-lockup-view-model, ytd-playlist-video-renderer')]
.filter(el => el.querySelector('a[href*="/watch?v="][href*="index="]'));
// 1. Load the whole list
let last = -1, idle = 0;
while (idle < 3) {
window.scrollTo(0, document.documentElement.scrollHeight);
await sleep(1200);
const n = rows().length;
idle = n === last ? idle + 1 : 0;
last = n;
panel.text(`Cargando tus vídeos que te gustan… ${n}`);
}
const total = LIMIT ? Math.min(LIMIT, rows().length) : rows().length;
if (!total) {
panel.finish('No tienes vídeos con «me gusta».');
return 0;
}
// 2. Ask
if (!await panel.ask(`¿Quitar el «me gusta» de ${many(total, 'vídeo')}?\nNo se puede deshacer.`, `Unlike ${total}`)) {
panel.finish('Cancelado. No se ha cambiado nada.');
return 0;
}
// 3. Remove them one by one. YouTube's new layout keeps removed rows on screen,
// so remember which videos are done.
let stop = false;
panel.stoppable(() => { stop = true; });
const videoId = el => new URL(el.querySelector('a[href*="/watch?v="]').href).searchParams.get('v');
const done = new Set();
// The row's three-dot menu: by its English label, else by its place in the layout (any language)
const menuButton = el => el.querySelector('button[aria-label="Action menu"], button[aria-label="More actions"]')
|| el.querySelector('[class*="MenuButton"] button, ytd-menu-renderer yt-icon-button button, ytd-menu-renderer #button button, #menu button');
let removed = 0;
while (!stop && removed < total) {
const el = rows().find(r => !done.has(videoId(r)));
if (!el) break;
done.add(videoId(el));
el.scrollIntoView({ block: 'center' });
menuButton(el).click();
const item = await waitFor(() => [...document.querySelectorAll('yt-list-item-view-model, ytd-menu-service-item-renderer')]
.find(i => visible(i) && REMOVE.test(i.textContent)));
if (!item) {
panel.finish(`Quitados ${removed}; después no se encontró «Quitar de Vídeos que me gustan» en el menú.\nPuede que YouTube haya cambiado su diseño: avísanos en responsive-muse.com.`);
return removed;
}
item.click();
// Wait for the menu to close, so the next video doesn't reuse this menu
await waitFor(() => ![...document.querySelectorAll('yt-list-item-view-model, ytd-menu-service-item-renderer')]
.some(i => visible(i) && REMOVE.test(i.textContent)) || null);
removed++;
panel.text(`Unliking… ${removed} of ${total}`);
await sleep(DELAY);
}
panel.finish(`${stop ? 'Parado' : 'Hecho'}: quitados ${removed} de ${many(total, 'vídeo')}.\nRecarga la página para ver el resultado.`);
return removed;
})();
Marcador: arrastra el botón del medio a tu barra de marcadores, abre www.youtube.com y pulsa el marcador. Ejecuta el mismo script con las opciones de arriba.
- No envía nada a ningún sitio. Sin fetch, XHR ni scripts externos. La única actividad de red es la de www.youtube.com cargando tu lista.
- No toca tu sesión. No lee cookies, contraseñas, tokens ni el almacenamiento del navegador.
- Solo funciona en www.youtube.com. En cualquier otra web se detiene antes de hacer nada.
- Corto y legible. 130 líneas comentadas, sin minificar ni ofuscar.
- Pregunta antes de cambiar nada. Un recuadro en la página muestra lo que ha encontrado y espera tu OK. Puedes pararlo cuando quieras.
- El mismo código para todos. SHA-256 de la versión por defecto:
3a04f12a0d396d6a…
Compruébalo tú mismo en 30 segundos
- Léelo: todas las líneas están arriba, con comentarios.
- Busca en el código
fetch,XMLHttpRequest,cookie,localStorageoeval. No aparece ninguna. - Abre la pestaña Red (Network) antes de ejecutarlo: solo verás peticiones a www.youtube.com.
Ten en cuenta: esto no se puede deshacer en bloque. El script siempre muestra cuántos hay y pregunta antes de empezar. Deja la pestaña abierta hasta que el recuadro diga «Hecho».
Cómo usarlo
- Abre Vídeos que me gustan con tu sesión iniciada.
- Abre la consola: F12 o Ctrl+Mayús+J (Cmd+Opción+J en Mac). Si Chrome te lo pide, escribe
permitir pegar(oallow pastingsi lo tienes en inglés) y pulsa Enter. - Elige las opciones, copia el script, pégalo en la consola y pulsa Enter. Un recuadro te dice cuántos ha encontrado y espera tu confirmación antes de empezar. Puedes pulsar Parar cuando quieras.
Cómo funciona
Quitar un vídeo de «Vídeos que me gustan» es lo mismo que volver a pulsar el botón de «me gusta». El script lo hace vídeo a vídeo, con una pausa para que YouTube no frene las peticiones.
Preguntas frecuentes
¿Quitar un vídeo de «Vídeos que me gustan» quita el «me gusta»?
Sí. Quitarlo de esa lista es lo mismo que volver a pulsar el botón de «me gusta».
¿Por qué hace pausas entre vídeos?
Para ir a ritmo de persona y que YouTube no frene ni bloquee las peticiones. Puedes cambiar la pausa en el script.
