-
-
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