【问题标题】:Is there a javascript to remove duplicate videos in a Youtube playlist?是否有 javascript 可以删除 Youtube 播放列表中的重复视频?
【发布时间】:2021-04-04 09:17:38
【问题描述】:

由于YouTube discontinuedremove 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);

【问题讨论】:

    标签: javascript youtube playlist bookmarklet


    【解决方案1】:

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

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

    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()
    
    

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

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

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

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

    【讨论】:

    • 太棒了,@TS!剧本就像一个魅力。我也想出了手动解决方案,但只是在将新视频从其他播放列表添加到播放列表时,因为我没有意识到 (5) 中的技巧。
    • 是否有机会添加一个滚动播放列表以将所有视频加载到窗口的例程?
    • 非常感谢。我使用了您关于删除重复项的“官方”方法的建议。原始播放列表有 4859 个曲目,去重版本有 4351 个。我担心 YouTube 音乐上没有的众多视频(例如合辑或翻唱)不会被添加,但看起来它们是添加的。 [如果有人好奇,重复的原因是当我想将视频添加到列表顶部时,我会尝试将其删除并再次添加。看起来所做的只是多次添加视频。]
    猜你喜欢
    • 2021-08-11
    • 2017-06-25
    • 2021-08-14
    • 2012-12-11
    • 2014-02-07
    • 2018-04-01
    • 2018-06-24
    • 1970-01-01
    • 2017-09-20
    相关资源
    最近更新 更多