You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求修复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 11:53:17