是否有 JavaScript 可以删除 Youtube 播放列表中的重复视频?

And*_*evy 5 javascript youtube bookmarklet playlist

由于YouTube 在其界面上不再使用remove duplicates按钮(大约在同一时间,他们不再使用非聚合物界面),因此用户在删除播放列表中的重复数据时不知所措。我到处寻找工具来做到这一点,但无济于事。我发现这个脚本可以从播放列表中删除所有视频,并且想知道是否可以修改它(由比我更了解 javascript 的人)以仅删除重复的视频:

setInterval(function () {
  document.querySelector('#primary button[aria-label="Action menu"]').click();
  var things = document.evaluate(
    '//span[contains(text(),"Remove from")]',
    document,
    null,
    XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
    null
  );
  for (var i = 0; i < things.snapshotLength; i++) {
    things.snapshotItem(i).click();
  }
}, 1000);
Run Code Online (Sandbox Code Playgroud)

T S*_*T S 7

实际上(截至 2021 年 11 月 7 日)仍然有一种官方方法来创建播放列表的新的无重复副本:

  1. 打开 Youtube Music 并创建播放列表https://music.youtube.com/library/playlists (播放列表需要在 youtube music 上创建,否则播放列表将在 youtube music 上不可见...)

  2. 打开您想要在常规 YouTube 上删除重复项的播放列表,例如:https ://www.youtube.com/playlist?list=PLlrATfBNZ98dudnM48yfGUldqGD0S4FFb

  3. 使用第一个视频的菜单(视频右侧的三个点)并选择“保存到播放列表”,然后将播放列表的第一个视频保存到新创建的 YouTube 音乐播放列表(在步骤 1 中创建)

  4. www将您的网址替换为music,以访问旧播放列表的 YouTube 音乐视图,例如: https: //music.youtube.com/playlist ?list=PLlrATfBNZ98dudnM48yfGUldqGD0S4FFb

  5. 使用菜单(三个点)并选择“添加到播放列表”将旧播放列表添加到新的(在步骤 1 创建的)播放列表中。由于新的播放列表已包含旧播放列表的视频(在步骤 3 中添加),因此您现在会遇到一个问题:是否要跳过重复项,因此...

  6. ...您选择“跳过重复项”。这似乎不仅会跳过最初已包含在新播放列表中的视频,而且仅添加旧播放列表中的每个视频一次,从而删除重复项。


替代方案:Javascript解决方案:

这并不是很好,因为它似乎只能在每次按下按钮后进行睡眠,但这对我有用:

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

async function removeduplicates() {
    let titles = document.querySelectorAll('#primary #video-title')
    let href_pattern = RegExp('https?://www\\.youtube\\.com/watch\\?v=[^&]*&list=[^&]*&index=')
    titles = Array.from(titles).filter(t => href_pattern.test(t.href))
    let lastid='';
    for (let i = 0; i < titles.length; i++) {
        let id = titles[i].href.match(/\\?v=([^&]+)/)[1]
        if(id == lastid){
            titles[i].focus()
            titles[i].parentElement.parentElement.parentElement.parentElement.parentElement.querySelector('button[aria-label="Action menu"]').click()
            await sleep(100)
            var things = document.evaluate(
                '//span[contains(text(),"Remove from")]',
                document,
                null,
                XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
                null
            );
            await sleep(300)
            for (var j = 0; j < things.snapshotLength; j++) {
                things.snapshotItem(j).click();
            }
            console.log(titles[i].innerText)
        }
        lastid=id;
    }
}

removeduplicates()

Run Code Online (Sandbox Code Playgroud)

另请注意,它仅在您的语言设置为英语时才有效,因为删除按钮是通过字符串“Remove from”找到的。

要运行此程序,您需要位于要从中删除重复项的播放列表的播放列表页面(例如https://www.youtube.com/playlist?list=PLlrATfBNZ98dudnM48yfGUldqGD0S4FFb )。然后按 F12,将代码粘贴到 javascript 控制台并按 Enter。

注意:仅当两个相同的视频彼此跟随时才会删除重复项,因此您需要按视频的发布日期等对播放列表进行排序。

注意2:仅考虑当前加载到浏览器窗口中的视频,因此您需要向下滚动直到播放列表末尾,以便真正加载所有视频。