Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save astamicu/eb351ce10451f1a51b71a1287d36880f to your computer and use it in GitHub Desktop.
Save astamicu/eb351ce10451f1a51b71a1287d36880f to your computer and use it in GitHub Desktop.
Script to remove all videos from Youtube Watch Later playlist

UPDATED 22.11.2022

It's been two years since the last update, so here's the updated working script as per the comments below.

Thanks to BryanHaley for this.

setInterval(function () {
    video = document.getElementsByTagName('ytd-playlist-video-renderer')[0];

    video.querySelector('#primary button[aria-label="Action menu"]').click();

    var things = document.evaluate(
        '//span[contains(text(),"Remove from")]',
        document,
        null,
        XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
        null
    );

    for (var i = 0; i < things.snapshotLength; i++) 
    {
        things.snapshotItem(i).click();
    }
}, 500);

Non-english users will need to change "Action menu" and "Remove from" to what YouTube uses for their localization.

@ArthurYdalgo
Copy link

It worked for some time but then started saying 'this operation cannot be performed'. Not only can I delete stuff now but I cannot even add stuff. Google really wants you to not clear watch later to keep you addicted.

depending on how long you take between one request and the other, you might get a 429 http error (too many requests in a short time period). try spacing them a little bit. my sweet spot (from a test in june 9th, 2023) was 1750ms between requests. fast enough, but not enough to get blocked by their api

@Cero-Pointer
Copy link

Updated for german users:

setInterval(function () {
    video = document.getElementsByTagName('ytd-playlist-video-renderer')[0];

    video.querySelector('#primary button[aria-label="Aktionsmenü"]').click();

    var things = document.evaluate(
        '//span[contains(text(),"entfernen")]',
        document,
        null,
        XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
        null
    );

    for (var i = 0; i < things.snapshotLength; i++) 
    {
        things.snapshotItem(i).click();
    }
}, 500);

@LosAlamosAl
Copy link

Sadly, as of 1/8/2024, none of these (English versions) work. Various errors (POST errors at YouTube, "Something went wrong", "This functionality currently not available; please try again later"). A common theme is that they work for a while (maybe 100 or so videos) then they die.

If you get stuck with continuously running Javascript as I did:

  • in the JavaScrip console window type debugger; throw 1
  • then from the Chrome "Window" menu --> "Task Manager"; find the Watch Later tab and kill it.

FYI, I'm running Chrome version 120.0.6099.71 (Official Build) (arm64) on MacOS 14.2

@jzisser9
Copy link

jzisser9 commented Jan 9, 2024

@LosAlamosAl if I had to guess, it's YouTube rate-limiting at work. Especially if it's a nice round number like 100.

@LosAlamosAl
Copy link

@jzisser9 Almost certainly, since it's about the same number (+- 10) with the user script by @js6pak. I cranked it down to about 5 seconds per deletion--same results.

@x94fujo6rpg
Copy link

x94fujo6rpg commented Feb 15, 2024

They somehow managed to break this thing again.
They seemed rolling back years of everything you'd already watched and then shoved it all back in.
My home is full of videos from the WL list like 80% of them.
Even after using the [remove watched] there are still over 1000 videos in the list.
And still tons of videos that I'm pretty sure I've already watched.

(async function fkYoutubeWatchLater() {
	let list = document.querySelectorAll("#contents.ytd-playlist-video-list-renderer>ytd-playlist-video-renderer");

	if (list.length > 0) {
		for (let item of list) {
			let target,
				target_index = 3,
				title;

			item.querySelector("#button").click();
			await sleep(500);

			target = document.querySelector("tp-yt-paper-listbox#items.style-scope.ytd-menu-popup-renderer");
			if (!target) {
				continue;
			}

			title = item.querySelector("#meta #video-title").textContent.trim();
			console.log(`removing video: ${title}`);
			target = target.childNodes[target_index];
			target.click();

			await sleep(1750);
		}

		setTimeout(() => fkYoutubeWatchLater(), 5000);
	} else {
		return;
	}

	function sleep(ms = 500) {
		return new Promise(resolve => setTimeout(resolve, ms));
	}
})();

@x94fujo6rpg
Copy link

x94fujo6rpg commented Feb 15, 2024

Sadly, as of 1/8/2024, none of these (English versions) work. Various errors (POST errors at YouTube, "Something went wrong", "This functionality currently not available; please try again later"). A common theme is that they work for a while (maybe 100 or so videos) then they die.

If you get stuck with continuously running Javascript as I did:

  • in the JavaScrip console window type debugger; throw 1
  • then from the Chrome "Window" menu --> "Task Manager"; find the Watch Later tab and kill it.

FYI, I'm running Chrome version 120.0.6099.71 (Official Build) (arm64) on MacOS 14.2

I think the issue is you have to scroll down to load more video.
And it will stop loading after a while somehow. (like they know what you're doing)

My script started randomly stopping at around 100 after successfully delete 700+ videos in one go.

@AttiliaTheHun
Copy link

Not sure if somebody mentioned it already, but you can click on your profile icon and select "Change language" (select English) and then there is no need for localized versions of the script. Next time you open youtube you simply change the language back, if it doesn't happen automatically.

@mpr1255
Copy link

mpr1255 commented Feb 15, 2024 via email

@derharry
Copy link

derharry commented Mar 11, 2024

Thanks for the script :-) I set the seconds down to 200ms - that speeded it up for me.
I was looking for hours for the button to remove everything at once, but it seems that Google removed it.

@vinivosh
Copy link

vinivosh commented Apr 1, 2024

Brazilian Portuguese version:

setInterval(function () {
    video = document.getElementsByTagName('ytd-playlist-video-renderer')[0];

    video.querySelector('#primary button[aria-label="Menu de ações"]').click();

    var things = document.evaluate(
        '//span[contains(text(),"Remover de")]',
        document,
        null,
        XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
        null
    );

    for (var i = 0; i < things.snapshotLength; i++) 
    {
        things.snapshotItem(i).click();
    }
}, 500);

@guilhermecgs
Copy link

Brazilian Portuguese version:

setInterval(function () {
    video = document.getElementsByTagName('ytd-playlist-video-renderer')[0];

    video.querySelector('#primary button[aria-label="Menu de ações"]').click();

    var things = document.evaluate(
        '//span[contains(text(),"Remover de")]',
        document,
        null,
        XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
        null
    );

    for (var i = 0; i < things.snapshotLength; i++) 
    {
        things.snapshotItem(i).click();
    }
}, 500);

👍

@macaua-23
Copy link

Thanks a lot @vinivosh & @colejd. It works.

@ArthurYdalgo
Copy link

Thanks for the script :-) I set the seconds down to 200ms - that speeded it up for me. I was looking for hours for the button to remove everything at once, but it seems that Google removed it.

probably because the requests were timing out

@SbMan1
Copy link

SbMan1 commented Apr 26, 2024

Made my own userscript which doesn't rely on the language and allows you to delete with progress threshold: https://gist.github.com/js6pak/33bdefdefac09c387f55d08c5b9526fa

I modified this to also remove videos published over X days old, and those that are private or deleted. This currently relies on the language though (English). It could be updated to look for 'no_thumbnail' in the thumbnail source though

Do you happen to still have this code as this would be very helpful. I just noticed I have 4,800 Watched Later and heard if I hit 5k I can't add anymore. I also msg'd js6pak on his forked page. I'll just do Date Added ( Oldest ) to make it the easiest, if I delete ones I don't want then oh well. Thanks for your time.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment