Greasy Fork is available in English.

BiliBili换一换,换回来

点击换一换后推荐的内容就再也找不到了? 没关系既然能换走,现在也能换回来

// ==UserScript==
// @name         BiliBili换一换,换回来
// @namespace    https://greasyfork.org/scripts/478516-bilibili%E6%8D%A2%E4%B8%80%E6%8D%A2-%E6%8D%A2%E5%9B%9E%E6%9D%A5/code/BiliBili%E6%8D%A2%E4%B8%80%E6%8D%A2,%E6%8D%A2%E5%9B%9E%E6%9D%A5.user.js
// @version      2024.04.2401
// @description  点击换一换后推荐的内容就再也找不到了? 没关系既然能换走,现在也能换回来
// @author       CNGEGE
// @match        https://www.bilibili.com/
// @match        https://www.bilibili.com/?*
// @icon         data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgMTYgMTYiIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgZmlsbD0iY3VycmVudENvbG9yIiBzdHlsZT0idHJhbnNmb3JtOiByb3RhdGUoLTY0ODBkZWcpOyI+PHBhdGggZD0iTTguNjI0OTMzMzMzMzMzMzMzIDEzLjY2NjY2NjY2NjY2NjY2NkM4LjYyNDkzMzMzMzMzMzMzMyAxNC4wMTE4NDk5OTk5OTk5OTkgOC4zNDUxMjUgMTQuMjkxNjY2NjY2NjY2NjY2IDcuOTk5OTMzMzMzMzMzMzMzIDE0LjI5MTY2NjY2NjY2NjY2NkM0LjUyNTE2NjY2NjY2NjY2NiAxNC4yOTE2NjY2NjY2NjY2NjYgMS43MDgyOTMzMzMzMzMzMzMyIDExLjQ3NDc5MTY2NjY2NjY2NSAxLjcwODI5MzMzMzMzMzMzMzIgOEMxLjcwODI5MzMzMzMzMzMzMzIgNi4wMTMzMDgzMzMzMzMzMzMgMi42Mjk4MjUgNC4yNDE0MjMzMzMzMzMzMzM1IDQuMDY2MzIxNjY2NjY2NjY3IDMuMDg5Mzg1QzQuMzM1NjAzMzMzMzMzMzMzIDIuODczNDI4MzMzMzMzMzMzNSA0LjcyODk1OTk5OTk5OTk5OSAyLjkxNjY1MzMzMzMzMzMzMzUgNC45NDQ5MTUgMy4xODU5MzQ5OTk5OTk5OTk3QzUuMTYwODcxNjY2NjY2NjY2IDMuNDU1MjA5OTk5OTk5OTk5NyA1LjExNzY0NjY2NjY2NjY2NjUgMy44NDg1NzMzMzMzMzMzMzMgNC44NDgzNjY2NjY2NjY2NjYgNC4wNjQ1MjgzMzMzMzMzMzM1QzMuNjk0OTc1IDQuOTg5NTMgMi45NTgyOTMzMzMzMzMzMzI4IDYuNDA4NTIgMi45NTgyOTMzMzMzMzMzMzI4IDhDMi45NTgyOTMzMzMzMzMzMzI4IDEwLjc4NDQxNjY2NjY2NjY2NyA1LjIxNTUyODMzMzMzMzMzMyAxMy4wNDE2NjY2NjY2NjY2NjYgNy45OTk5MzMzMzMzMzMzMzMgMTMuMDQxNjY2NjY2NjY2NjY2QzguMzQ1MTI1IDEzLjA0MTY2NjY2NjY2NjY2NiA4LjYyNDkzMzMzMzMzMzMzMyAxMy4zMjE0ODMzMzMzMzMzMzMgOC42MjQ5MzMzMzMzMzMzMzMgMTMuNjY2NjY2NjY2NjY2NjY2ek0xMS4wNjA0NzUgMTIuODEwNTU4MzMzMzMzMzMzQzEwLjg0NDIyNTAwMDAwMDAwMiAxMi41NDE1NTgzMzMzMzMzMzEgMTAuODg3MDMzMzMzMzMzMzM1IDEyLjE0ODEyNSAxMS4xNTYwNDE2NjY2NjY2NjcgMTEuOTMxODc1QzEyLjMwNjg1ODMzMzMzMzMzMyAxMS4wMDY3NzUgMTMuMDQxNTk5OTk5OTk5OTk5IDkuNTg5NDI0OTk5OTk5OTk5IDEzLjA0MTU5OTk5OTk5OTk5OSA4QzEzLjA0MTU5OTk5OTk5OTk5OSA1LjIxNTU2MTY2NjY2NjY2NiAxMC43ODQ0MDgzMzMzMzMzMzIgMi45NTgzMzMzMzMzMzMzMzMgNy45OTk5MzMzMzMzMzMzMzMgMi45NTgzMzMzMzMzMzMzMzNDNy42NTQ4MDgzMzMzMzMzMzI1IDIuOTU4MzMzMzMzMzMzMzMzIDcuMzc0OTMzMzMzMzMzMzMzIDIuNjc4NTA4MzMzMzMzMzMzMyA3LjM3NDkzMzMzMzMzMzMzMyAyLjMzMzMzMzMzMzMzMzMzM0M3LjM3NDkzMzMzMzMzMzMzMyAxLjk4ODE1MzMzMzMzMzMzMzIgNy42NTQ4MDgzMzMzMzMzMzI1IDEuNzA4MzMzMzMzMzMzMzMzMyA3Ljk5OTkzMzMzMzMzMzMzMyAxLjcwODMzMzMzMzMzMzMzMzNDMTEuNDc0NzI1MDAwMDAwMDAxIDEuNzA4MzMzMzMzMzMzMzMzMyAxNC4yOTE1OTk5OTk5OTk5OTkgNC41MjUyMDY2NjY2NjY2NjcgMTQuMjkxNTk5OTk5OTk5OTk5IDhDMTQuMjkxNTk5OTk5OTk5OTk5IDkuOTg0MTA4MzMzMzMzMzMzIDEzLjM3MjQ4MzMzMzMzMzMzMiAxMS43NTM5NTgzMzMzMzMzMzIgMTEuOTM5MjI1IDEyLjkwNjEyNUMxMS42NzAxNjY2NjY2NjY2NjMgMTMuMTIyMzc1IDExLjI3NjcyNSAxMy4wNzk2MjUgMTEuMDYwNDc1IDEyLjgxMDU1ODMzMzMzMzMzM3oiIGZpbGw9ImN1cnJlbnRDb2xvciI+PC9wYXRoPjxwYXRoIGQ9Ik0xLjM3NSAzLjQxMzA4NjY2NjY2NjY2NjZDMS4zNzUgMy4wNjc5MDY2NjY2NjY2NjY2IDEuNjU0ODI1IDIuNzg4MDg2NjY2NjY2NjY2NiAyIDIuNzg4MDg2NjY2NjY2NjY2Nkw0LjMzMzMzMzMzMzMzMzMzMyAyLjc4ODA4NjY2NjY2NjY2NjZDNC44NjI2MDgzMzMzMzMzMzMgMi43ODgwODY2NjY2NjY2NjY2IDUuMjkxNjY2NjY2NjY2NjY2IDMuMjE3MTQ0OTk5OTk5OTk5NSA1LjI5MTY2NjY2NjY2NjY2NiAzLjc0NjQxOTk5OTk5OTk5OTZMNS4yOTE2NjY2NjY2NjY2NjYgNi4wNzk3NTMzMzMzMzMzMzRDNS4yOTE2NjY2NjY2NjY2NjYgNi40MjQ5MjgzMzMzMzMzMzQgNS4wMTE4NDE2NjY2NjY2NjYgNi43MDQ3MzY2NjY2NjY2NjYgNC42NjY2NjY2NjY2NjY2NjYgNi43MDQ3MzY2NjY2NjY2NjZDNC4zMjE0OTE2NjY2NjY2NjcgNi43MDQ3MzY2NjY2NjY2NjYgNC4wNDE2NjY2NjY2NjY2NjYgNi40MjQ5MjgzMzMzMzMzMzQgNC4wNDE2NjY2NjY2NjY2NjYgNi4wNzk3NTMzMzMzMzMzMzRMNC4wNDE2NjY2NjY2NjY2NjYgNC4wMzgwODY2NjY2NjY2NjdMMiA0LjAzODA4NjY2NjY2NjY2N0MxLjY1NDgyNSA0LjAzODA4NjY2NjY2NjY2NyAxLjM3NSAzLjc1ODI2MTY2NjY2NjY2NjQgMS4zNzUgMy40MTMwODY2NjY2NjY2NjY2eiIgZmlsbD0iY3VycmVudENvbG9yIj48L3BhdGg+PHBhdGggZD0iTTE0LjYyNSAxMi41ODY0QzE0LjYyNSAxMi45MzE1OTE2NjY2NjY2NjYgMTQuMzQ1MTgzMzMzMzMzMzMzIDEzLjIxMTQgMTQgMTMuMjExNEwxMS42NjY2NjY2NjY2NjY2NjYgMTMuMjExNEMxMS4xMzc0MDgzMzMzMzMzMzUgMTMuMjExNCAxMC43MDgzMzMzMzMzMzMzMzIgMTIuNzgyMzgzMzMzMzMzMzMyIDEwLjcwODMzMzMzMzMzMzMzMiAxMi4yNTMwNjY2NjY2NjY2NjVMMTAuNzA4MzMzMzMzMzMzMzMyIDkuOTE5NzMzMzMzMzMzMzMzQzEwLjcwODMzMzMzMzMzMzMzMiA5LjU3NDYwODMzMzMzMzMzNCAxMC45ODgxNSA5LjI5NDczMzMzMzMzMzMzMyAxMS4zMzMzMzMzMzMzMzMzMzIgOS4yOTQ3MzMzMzMzMzMzMzNDMTEuNjc4NTE2NjY2NjY2NjY3IDkuMjk0NzMzMzMzMzMzMzMzIDExLjk1ODMzMzMzMzMzMzMzMiA5LjU3NDYwODMzMzMzMzMzNCAxMS45NTgzMzMzMzMzMzMzMzIgOS45MTk3MzMzMzMzMzMzMzNMMTEuOTU4MzMzMzMzMzMzMzMyIDExLjk2MTRMMTQgMTEuOTYxNEMxNC4zNDUxODMzMzMzMzMzMzMgMTEuOTYxNCAxNC42MjUgMTIuMjQxMjc1MDAwMDAwMDAyIDE0LjYyNSAxMi41ODY0eiIgZmlsbD0iY3VycmVudENvbG9yIj48L3BhdGg+PC9zdmc+
// @grant        none
// @license      Apache 2
// @require      https://cdn.jsdelivr.net/npm/jquery@3.7.1/dist/jquery.min.js
// @run-at      document-end
// ==/UserScript==

(function() {
    'use strict';
    // 全局变量
    /* 换一换 按钮 */
    let roll_btn = $("button.primary-btn.roll-btn"); // 自然 一开始是没有的
    let back_btn = {};   // 脚本创建的按钮
    let historyItem = [];// 用于记录的历史视频
    let currentBatch = 0;
    let rotete = 0;      // 用于旋转动画的 记录的旋转角度

    main();

    /* 主方法 */
    function main(){
        // 首先我要延迟循环去查找 换一换按钮, 因为这个按钮是JS动态载入的
      let loopid = setInterval(()=>{
        // 获取
        roll_btn = $("button.primary-btn.roll-btn svg path");
        if(roll_btn.length > 0){
          roll_btn = $("button.primary-btn.roll-btn");
          roll_btn_load();
          clearInterval(loopid);
        }
      },500);

    }

    /* 原始的换一换按钮载入了 */
    function roll_btn_load(){
      // 两件事
      /* 1. 复制按钮*/
      back_btn = roll_btn.clone();
      back_btn.addClass("back-btn");
      back_btn.css("margin-top","10px");
      back_btn.find("span").text("换回来");
      roll_btn.after(back_btn);
      /* 2. 监听原始按钮点击*/
      roll_btn.click(roll_btn_click);
      /* 3. 监听复制后按钮的点击 */
      back_btn.mousedown(back_btn_click);
      /* 4. 屏蔽复制后按钮的默认右键事件 */
      //back_btn.
      back_btn.bind("contextmenu",function(e){
        return false;
      });
    }

    /* 原始的换一换按钮点击事件 */
    function roll_btn_click(event){
      //在切换前将项目记录下来
      let olditem = $("div.container").find(".feed-card");
      if(olditem.length > 0){
          for(let i=0;i<olditem.length;i++){
            historyItem[currentBatch * olditem.length + i] = $(olditem[i]).find(".bili-video-card").clone();
          }
          currentBatch++;
          // 修改换回来按钮的悬浮提示文字
          updateTitle();
      }
      else{
          console.error("准备记录时,没有找到视频节点");
      }
    }

    /* 复制后的换回来按钮的点击事件 */
    function back_btn_click(event){
      if(event.which == 1){ //左键
        // 反向旋转图标
        rotete-=720;
        back_btn.find("svg").css("transform","rotate("+rotete+"deg)");

        //复原项目
        if(historyItem.length > 0 && currentBatch > 0){
          currentBatch--;
          let olditem = $("div.container").find(".feed-card");
          for(let i=0;i<olditem.length;i++){
            // 先把原来的remove掉
            $(olditem[i]).find(".bili-video-card").remove();
            $(olditem[i]).append(historyItem[currentBatch * olditem.length + i]);
          }
          updateTitle();
        }
      }else if(event.which == 3){ // 右键
        currentBatch = 0;
        for(let i=0;i<historyItem.length;i++){
          historyItem[i] = null;
        }
        historyItem = [];
        back_btn.removeAttr("title");
      }
    }

    /* 修改换回来按钮的悬浮提示文字 */
    function updateTitle(){
      back_btn.attr("title",`当前队列:${currentBatch} 缓存项目大小:${historyItem.length} "右键清除缓存 释放内存"`);
    }
    // Your code here...
})();