NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name YouTube Playlist Watched and Streamed Videos Remover
// @namespace http://youtube.com/
// @version 1.0
// @description Automatically removes watched and streamed videos from YouTube playlist pages
// @author nascent
// @license GPL-3.0-or-later
// @match https://www.youtube.com/playlist?list=*
// @icon https://www.google.com/s2/favicons?sz=64&domain=youtube.com
// @grant none
// ==/UserScript==
(function() {
'use strict';
// Configuration
const CHECK_INTERVAL = 2000; // How often to check for new videos (in milliseconds)
// Helper function to check if a video is watched
function isVideoWatched(videoElement) {
const watchedOverlay = videoElement.querySelector('ytd-thumbnail-overlay-playback-status-renderer');
return watchedOverlay !== null;
}
// Helper function to check if a video was streamed
function isVideoStreamed(videoElement) {
const videoInfo = videoElement.querySelector('#video-info');
return videoInfo?.textContent.includes('Streamed');
}
// Function to process all videos in the playlist
function processPlaylistVideos() {
// Get all video elements in the playlist
const videoElements = document.querySelectorAll('ytd-playlist-video-renderer');
let removedCount = {
watched: 0,
streamed: 0
};
// Iterate through each video element
videoElements.forEach(videoElement => {
if (isVideoWatched(videoElement)) {
videoElement.remove();
removedCount.watched++;
} else if (isVideoStreamed(videoElement)) {
videoElement.remove();
removedCount.streamed++;
}
});
// Log the number of videos removed (if any)
if (removedCount.watched > 0 || removedCount.streamed > 0) {
console.log(`Removed ${removedCount.watched} watched videos and ${removedCount.streamed} streamed videos from playlist`);
}
}
// Function to add a control button to the page
function addControlButton() {
const playlistHeader = document.querySelector('ytd-playlist-header-renderer');
if (!playlistHeader || document.getElementById('remove-videos-btn')) return;
const button = document.createElement('button');
button.id = 'remove-videos-btn';
button.innerHTML = 'Remove Watched & Streamed Videos';
button.style.cssText = `
background-color: #cc0000;
color: white;
border: none;
border-radius: 2px;
padding: 10px 20px;
margin: 10px;
cursor: pointer;
font-size: 14px;
font-weight: 500;
`;
button.addEventListener('click', processPlaylistVideos);
playlistHeader.appendChild(button);
}
// Initial setup
function initialize() {
// Wait for the page to load
const observer = new MutationObserver((mutations, obs) => {
if (document.querySelector('ytd-playlist-header-renderer')) {
addControlButton();
processPlaylistVideos();
// Keep checking periodically for new videos (as YouTube loads them dynamically)
setInterval(processPlaylistVideos, CHECK_INTERVAL);
obs.disconnect();
}
});
observer.observe(document.body, {
childList: true,
subtree: true
});
}
// Start the script
initialize();
})();