Vacía tu lista de Ver más tarde en un minuto: todos los vídeos o solo los que ya has visto. Gratis, en tu navegador.
// Responsive Muse · Clear YouTube Watch Later · v1.1 · 2026-10-22
// Removes videos from your Watch Later list: all of them, or only the ones you've watched.
// Runs only on youtube.com/playlist?list=WL. It counts first and asks before removing anything,
// then clicks the same "Remove from Watch later" menu you would. It makes no network requests
// of its own and never reads cookies, passwords or tokens.
(async () => {
const TOOL = 'Vaciar Ver más tarde';
const MODE = 'all'; // 'all' or 'watched' (videos you've watched at least 90%)
const LIMIT = 0; // stop after this many videos (0 = no limit)
const DELAY = 600; // pause between actions, in milliseconds
if (location.hostname !== 'www.youtube.com' || new URLSearchParams(location.search).get('list') !== 'WL') {
alert('Open your Watch Later list first (signed in):\nhttps://www.youtube.com/playlist?list=WL');
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 Watch later" in English, Spanish, Portuguese, French, German and Italian
const REMOVE = /remove from watch later|quitar de ver más tarde|remover de assistir mais tarde|retirer de .*à regarder plus tard|aus .*später ansehen.* entfernen|rimuovi da guarda più tardi/i;
const rows = () => [...document.querySelectorAll('ytd-playlist-video-renderer, yt-lockup-view-model')]
.filter(el => el.querySelector('a[href*="/watch?v="][href*="index="]'));
const watched = el => {
const bar = [...el.querySelectorAll('#progress, [class*="ResumePlayback"], [class*="rogress"]')].find(b => b.style.width);
return bar ? parseFloat(bar.style.width) >= 90 : false;
};
const targets = () => rows().filter(el => MODE === 'all' || watched(el));
// 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 tu lista de Ver más tarde… ${n} vídeos`);
}
const total = LIMIT ? Math.min(LIMIT, targets().length) : targets().length;
if (!total) {
panel.finish(MODE === 'watched' ? 'No hay vídeos vistos que quitar.' : 'Tu lista de Ver más tarde está vacía.');
return 0;
}
// 2. Ask
const what = MODE === 'watched' ? 'vídeos vistos' : 'vídeos';
if (!await panel.ask(`Remove ${total} ${what.replace(/s$/, total === 1 ? '' : 's')} from Watch Later?\nNo se puede deshacer.`, `Remove ${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');
// 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');
const done = new Set();
let removed = 0;
while (!stop && removed < total) {
const el = targets().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('ytd-menu-service-item-renderer, yt-list-item-view-model')]
.find(i => visible(i) && REMOVE.test(i.textContent)));
if (!item) {
panel.finish(`Quitados ${removed}; después no se encontró «Quitar de Ver más tarde» 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('ytd-menu-service-item-renderer, yt-list-item-view-model')]
.some(i => visible(i) && REMOVE.test(i.textContent)) || null);
removed++;
panel.text(`Removing… ${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. 137 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:
fcc0336d1ef89f78…
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 tu lista de Ver más tarde 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.
¿Por qué no hay un botón para vaciarla?
YouTube solo ofrece «Quitar vídeos vistos» en el menú de la lista. Para quitarlo todo hay que abrir el menú de cada vídeo y pulsar «Quitar de Ver más tarde», uno a uno. El script hace exactamente eso por ti, con una pausa entre vídeos.
Preguntas frecuentes
¿Hay un botón de «vaciar todo» en YouTube?
No. YouTube solo ofrece «Quitar vídeos vistos» en el menú de Ver más tarde. Para quitarlo todo hay que borrar los vídeos uno a uno, que es lo que hace este script por ti.
¿Se puede deshacer?
No. Los vídeos quitados no se pueden recuperar en bloque. Si crees que los querrás, exporta antes tu lista de Ver más tarde.
¿Funciona en la app de YouTube?
No. Necesita un navegador de ordenador: Chrome, Edge, Firefox, Brave o Safari.
