Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save othyn/b8b30fa96c17f37227b946bd3e7afffa to your computer and use it in GitHub Desktop.
Save othyn/b8b30fa96c17f37227b946bd3e7afffa to your computer and use it in GitHub Desktop.
Clean YouTube Watch Later Videos
// 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
// adjust REMOVE_BUTTON_TEXT accordingly to your language, see examples below
(async function() {
const REMOVE_BUTTON_TEXT = 'Remove from Watch later'
// de-DE: const REMOVE_BUTTON_TEXT = 'Aus "Später ansehen" entfernen'
// pt-BR: const REMOVE_BUTTON_TEXT = 'Remover de Assistir mais tarde'
// swe-SE: const REMOVE_BUTTON_TEXT = 'Ta bort från Titta senare'
// zh-Hans-CN: const REMOVE_BUTTON_TEXT = '从稍后观看中移除'
const playlistName = document.querySelector("#title a").text
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(() => {
for (const actionMenu of [...document.querySelectorAll('ytd-popup-container > tp-yt-iron-dropdown')]) {
if(actionMenu => actionMenu.style.display !== "none") {
for (const actionButton of [...actionMenu.querySelectorAll('tp-yt-paper-item')]) {
if(actionButton.innerText.trim().toLowerCase() === REMOVE_BUTTON_TEXT.toLowerCase()){
return actionButton
}
}
}
}
console.debug("wait for removeButton")
})
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)
}
}
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment