Forked from qoomon/youtube_clean_watch_later_videos.js
Created
February 17, 2023 03:19
-
-
Save Kamensky124/ba37d83f96b1dbb397305140e21d36ca to your computer and use it in GitHub Desktop.
Clean YouTube Watch Later Videos
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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