-
-
Save qoomon/a3f71ff2b2a18ee297c9435d539d5247 to your computer and use it in GitHub Desktop.
| // Version 2.0.1 | |
| // This script will remove all videos from watch later list | |
| // | |
| // Usage | |
| // | |
| // #1 go to https://www.youtube.com/playlist?list=WL | |
| // #2 run following script in your browser console | |
| (async function() { | |
| const playlistName = document.querySelector('.metadata-wrapper #container #text')?.textContent || document.querySelector('#text')?.textContent | |
| if(!playlistName) { | |
| alert(`Couldn't determine playlist name!`) | |
| return | |
| } | |
| if(!confirm(`Are you sure to delete ALL videos from ${playlistName}?`)) { | |
| return | |
| } | |
| console.info("start...") | |
| while(true) { | |
| const videos = document.querySelectorAll('#primary ytd-playlist-video-renderer') | |
| if(videos.length == 0) break | |
| for (let videoElement of videos) { | |
| const videoTitle = videoElement.querySelector('a#video-title') | |
| console.info(`Remove Video\n` | |
| + ` Title: ${videoTitle.innerText}\n` | |
| + ` URL: ${videoTitle.href}`) | |
| const actionMenuButton = videoElement.querySelector('#menu #button') | |
| console.debug("click actionMenuButton", actionMenuButton) | |
| actionMenuButton.click() | |
| const removeButton = await untilDefined(() => document.evaluate( | |
| `//tp-yt-paper-listbox/ytd-menu-service-item-renderer[./tp-yt-paper-item/yt-formatted-string/span[text() = '${playlistName}']]`, | |
| document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue) | |
| console.debug("click removeButton", removeButton) | |
| removeButton.click() | |
| await sleep(200) | |
| } | |
| } | |
| console.info("done!") | |
| // === util functions ======================================================== | |
| async function sleep (timeout) { | |
| return new Promise(res => setTimeout(res, timeout)) | |
| } | |
| async function untilDefined(factory, checkInterval = 100) { | |
| while (true) { | |
| const value = factory() | |
| if (value != null) return value | |
| await sleep(checkInterval) | |
| } | |
| } | |
| })(); |
I've been testing my fork for few months that does not require lang specific options and modifications, could use more people trying it, also it's a Violentmonkey script
https://gist.github.com/sandorex/6bdd51ef467a079c87f19ba469a8bc7c
Feel free to take the code if you want
@sandorex thanks a lot, I've updated my script to your provided solution to get rid of language specific configuration.
It seems youtube did something so the script broke a bit, change
const playlistName = document.querySelector('.metadata-wrapper #container #text')?.textContent
to
const playlistName = document.querySelector('#text')?.textContent
The id stayed the same for a while now so im hopeful it wont need more fixing for a while 😄
@sandorex thx a lot, however for me it' works as expected with document.querySelector('.metadata-wrapper #container #text')?.textContent
Weird it works for me now too, it did not work yesterday for some reason
thank you
thx @othyn, I fixed it