请求修复YouTube播放列表去重脚本:报错+自动滚动需求
YouTube播放列表去重脚本修复:自动滚动+稳定执行
问题概述
你尝试用JavaScript脚本删除YouTube播放列表重复视频,但脚本运行几秒后报错,且无法自动滚动加载所有列表项。
你遇到的报错(翻译后)
资源 https://i.ytimg.com/generate_204 已通过link preload预加载,但在窗口加载事件后的几秒内未被使用。请确保它有合适的
as值且是有意预加载的。
DevTools 无法加载源映射:无法获取指定脚本的源映射文件内容,HTTP错误:状态码404
注意:这两个报错都是YouTube自身的资源加载问题,不会影响脚本核心功能,无需针对它们修改脚本。
修复后的完整脚本
function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } function $$(selector, context = document.documentElement) { return [...context?.querySelectorAll?.(selector) ?? []]; } // 自动滚动加载所有播放列表项 async function loadAllPlaylistItems() { let lastScrollHeight = 0; const playlistContainer = document.querySelector('#primary #contents'); if (!playlistContainer) return; while (true) { window.scrollTo(0, document.body.scrollHeight); await sleep(1500); // 等待加载,网络慢可适当调大 const currentScrollHeight = document.body.scrollHeight; if (currentScrollHeight === lastScrollHeight) break; lastScrollHeight = currentScrollHeight; } console.log('所有播放列表项已加载'); } async function removeDuplicates() { // 先加载完整列表 await loadAllPlaylistItems(); // 提取视频ID,筛选重复项 const videoElements = $$('#primary a#video-title'); const videoIdMap = new Map(); const duplicateElements = []; videoElements.forEach(el => { const urlParams = new URLSearchParams(el.href.split('?')[1]); const videoId = urlParams.get('v'); if (!videoId) return; if (videoIdMap.has(videoId)) { duplicateElements.push(el); } else { videoIdMap.set(videoId, el); } }); console.log(`找到 ${duplicateElements.length} 个重复视频`); // 倒序删除重复项,避免索引错乱 for (let i = duplicateElements.length - 1; i >= 0; i--) { const el = duplicateElements[i]; try { const itemRow = el.closest('#contents > ytd-playlist-video-renderer'); if (!itemRow) continue; // 打开操作菜单 const menuBtn = itemRow.querySelector('button[aria-label="操作菜单"]'); if (!menuBtn) continue; menuBtn.click(); await sleep(200); // 点击移除按钮 const removeBtn = document.querySelector('yt-formatted-string:has(span:contains("从播放列表中移除"))'); if (!removeBtn) { menuBtn.click(); // 关闭菜单,继续下一个 await sleep(100); continue; } removeBtn.click(); await sleep(500); // 等待删除完成 console.log(`已删除: ${el.innerText.trim()}`); } catch (err) { console.error(`删除失败: ${el.innerText.trim()}`, err); await sleep(1000); // 出错后等待再继续 } } console.log('重复视频删除完成'); } removeDuplicates();
核心修复点
- 自动加载全量列表:新增滚动逻辑,循环滚动到底部直到没有新内容加载,确保所有重复项都能被检测到
- 精准去重判断:通过视频URL中的
v参数提取唯一ID,替代原脚本的模糊href匹配,避免误判 - 稳定DOM操作:
- 倒序删除重复项,解决DOM元素删除后索引混乱的问题
- 增加异常捕获,单个项删除失败不中断整个流程
- 优化选择器定位,适配YouTube的UI结构
- 调整等待时间,匹配YouTube的菜单弹窗响应速度
内容的提问来源于stack exchange,提问作者Vector
相关产品推荐
相关产品推荐

