Greasy Fork is available in English.
小可...嘿嘿🤤🤤...阿梓...嘿嘿🤤🤤...笙歌...嘿嘿🤤🤤...
- // ==UserScript==// @name B站分P视频随机播放// @namespace https://qinlili.bid// @version 0.2.0// @description 小可...嘿嘿🤤🤤...阿梓...嘿嘿🤤🤤...笙歌...嘿嘿🤤🤤...// @author 琴梨梨// @match https://www.bilibili.com/video/*// @icon https://www.bilibili.com/favicon.ico// @homepage https://github.com/qinlili23333/BiliRandomPlay// @supportURL https://github.com/qinlili23333/BiliRandomPlay// @license GPLv3// @run-at document-idle// @grant GM_registerMenuCommand// ==/UserScript==(function() {'use strict';GM_registerMenuCommand("已经随机"+ localStorage.randomSwitch+"次", () => {if(confirm("真的要清除统计么?")){localStorage.randomSwitch=0;alert("清除成功!刷新页面后生效!")}});if(document.getElementById("multi_page")){const utils={parseInfo:text=>{return {now:text.substr(1,text.indexOf("/")-1),total:text.substr(text.indexOf("/")+1,text.length-text.indexOf("/")-2)}},random:(min, max)=> {return Math.round(Math.random() * (max - min)) + min;}}//检测到分P视频console.log("Multi Video Detected! Initializing Kero Engine... -Qinlili");let current=utils.parseInfo(document.getElementsByClassName("cur-page")[0].innerText);console.log(current)let next=0;let noClick=true;//接管pushState来替换分Phistory.pushState.bind(history)const originPush=history.pushStatewindow.history.pushState=(a,b,c)=>{if(c.startsWith("/video")){c=location.origin+c}const nextUrl=new URL(c)if((nextUrl.pathname==location.pathname)&&switchOn&&noClick){const nextParams=new URLSearchParams(nextUrl.search);nextParams.set('p', next);nextParams.set('random', 'on');if(localStorage.randomSwitch){localStorage.randomSwitch++;}else{localStorage.randomSwitch=1;}location.href=nextUrl.pathname+"?"+nextParams.toString();}else{originPush.call(history,a,b,c)searchParams = new URLSearchParams(document.location.search);}}//初始化随机播放切换let switchOn=false;let searchParams = new URLSearchParams(document.location.search);if(searchParams.get("random")=="on"){switchOn=true}const randomSwitch=document.querySelector("#multi_page > div.head-con > div.head-left > h3");//加载分P列表后文本会重置,所以监听分P列表加载(function(open) {XMLHttpRequest.prototype.open = function(method, url, async, user, pass) {if(url.indexOf("player/pagelist")>0){this.addEventListener('load', event=>{refreshText();document.querySelector("#multi_page > div.cur-list").addEventListener("click",()=>{//主动点击时避免切歌console.log("Prevent unwanted random. -Qinlili")noClick=false;setTimeout(()=>{noClick=true;},500)},true);});}open.call(this, method, url, async, user, pass);};})(XMLHttpRequest.prototype.open);//刷新文本const refreshText=()=>{if(switchOn){next=utils.random(1,current.total)randomSwitch.textContent="随机下一个:"+nextsearchParams.set('random', 'on');originPush.call(history,{},'',location.pathname+"?"+searchParams.toString())}else{randomSwitch.textContent="连续播放"searchParams.set('random', 'off');originPush.call(history,{},'',location.pathname+"?"+searchParams.toString())}}randomSwitch.addEventListener("click",event=>{event.stopPropagation();event.preventDefault();//处理切换模式switchOn=switchOn?false:true;refreshText();},true)}})();