// ==UserScript==
// @name 记录视频刷新历史(bilibili)
// @namespace http://greasyfork.icu/zh-CN/users/1196880-ling2ling4
// @version 1.0.4
// @author Ling2Ling4
// @description 记录每次刷新的视频, 可以方便的回溯之前错过的视频
// @license MIT
// @icon data:image/png;base64,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
// @match *://www.bilibili.com/
// @match *://www.bilibili.com/?*
// @run-at document-end
// @grant GM_setValue
// @grant GM_getValue
// @grant GM_registerMenuCommand
// @compatible chrome
// @compatible edge
// @compatible firefox
// ==/UserScript==
(function () {
("use strict");
const info = {
maxHistory: 10, // 历史视频的记录次数, 每次刷新出的视频算一次, 10
isLoadVideo: true, // 是否加载上次关闭页面的视频历史记录, true
base_isLoadVideo: true,
base_maxHistory: 10,
size: 20, // 按钮尺寸
index: 0, // 当前历史视频的组的索引
hoverColor: "#e3e5e7", // 按钮的hover颜色, #f5e3c1
hasCurVideos: false, // 最大索引位的那组视频是否存在, 通过该属性判断在计算时是否需要给最后一组视频占位
// waitTime: 2000, // 刷新页面后记录刷新视频的时间间隔
storageMaxHist: "setting_maxHistory",
storageHistVideos: "setting_histVideos",
storageIsLoadVideo: "setting_isLoadVideo",
};
const txt = {
lBtnTt: "返回上一组视频",
rBtnTt: "切换下一组视频",
maxHistory: `设置历史视频的记录次数, 默认: `,
isLoadVideo: `每次打开B站时是否恢复上次关闭页面的视频历史记录
默认: ${info.base_isLoadVideo ? "是 (确定)" : "否 (取消)"}
当前: `,
// settingSize: `设置按钮尺寸`,
};
const classList = {
vBox: "container", // 视频区域 的容器元素
video: "feed-card", // 换一换的视频 (一般是前十个)
btnBox: "feed-roll-btn", // 按钮的父元素
btn: "roll-btn", // 右侧换一换按钮
};
const doms = {};
let vHistory = []; // 历史视频的记录, [[vdom1, vdom2, ...], [vdom1, ...], ...]
function initValue() {
info.maxHistory = GM_getValue(info.storageMaxHist) || info.base_maxHistory;
info.isLoadVideo = GM_getValue(info.storageIsLoadVideo);
info.isLoadVideo === undefined &&
(info.isLoadVideo = info.base_isLoadVideo);
if (info.isLoadVideo) {
loadVideos();
} else {
GM_setValue(info.storageHistVideos, "[]");
}
}
function getDoms() {
doms.vBox = document.querySelector("." + classList.vBox);
// doms.btnBox = document.querySelector("." + classList.btnBox);
// doms.btn = doms.btnBox && doms.btnBox.querySelector("." + classList.btn);
}
// 获取最大索引
function getMaxIndex() {
return vHistory.length - 1 + (info.hasCurVideos ? 0 : 1);
}
// 更新视频历史记录
function updateHistory() {
doms.curVideos = [].slice.call(
doms.vBox.querySelectorAll("." + classList.video)
);
if (
vHistory[vHistory.length - 1] &&
doms.curVideos[0] === vHistory[vHistory.length - 1][0]
) {
return;
}
vHistory.push(doms.curVideos);
if (info.index === vHistory.length - 1) {
info.hasCurVideos = true;
}
if (vHistory.length > info.maxHistory) {
vHistory.splice(0, 1); // 过长删除第一项
info.index--;
}
info.isLoadVideo && saveVideos();
}
// 删除当前这组视频
function delCurVideos() {
const vArr = [].slice.call(
doms.vBox.querySelectorAll("." + classList.video)
);
// const delArr = [];
vArr.forEach((ele) => {
ele.remove();
// delArr.push(doms.vBox.removeChild(ele));
});
// return delArr;
}
// 切换 上一组/下一组 视频
function historyChange(f = "left") {
if (!info.hasCurVideos && info.index === vHistory.length - 1 + 1) {
updateHistory();
}
if (f === "right") {
// 下一组
info.index++;
if (info.index > vHistory.length - 1) {
info.index = vHistory.length - 1;
return;
}
} else {
// 上一组
info.index--;
if (info.index < 0) {
info.index = 0;
return;
}
}
delCurVideos();
const twoVideo = doms.vBox.children[1];
// 将历史视频插入最前面
vHistory[info.index].forEach((ele) => {
doms.vBox.insertBefore(ele, twoVideo);
});
}
// 增加历史视频切换按钮
function createBtns() {
const dom = document.createElement("div");
dom.innerHTML = `<div id="vHistory-box" style="display:flex;width:100%;line-height:${
info.size - 3
}px;margin-top:10px">
<style>.vHistoryBtn {width:${info.size}px;height:${
info.size
}px;text-align:center;border-radius:${info.size / 5}px;cursor:pointer;}
.vHistoryBtn:hover {background:${info.hoverColor};}</style>
<div class="left-historyBtn vHistoryBtn" title="${txt.lBtnTt}">
<svg t="1698507568902" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"
p-id="918" xmlns:xlink="http://www.w3.org/1999/xlink" width="${
info.size - 6
}" height="${info.size - 6}">
<path d="M796.444444 113.777778c0 17.066667-5.688889 34.133333-17.066666 45.511111L409.6 472.177778c-5.688889 11.377778-11.377778 17.066667-11.377778 34.133333 0 5.688889 5.688889 22.755556 11.377778 28.444445l364.088889 329.955555c22.755556 22.755556 22.755556 56.888889 5.688889 79.644445-22.755556 22.755556-56.888889 22.755556-79.644445 5.688888l-364.088889-329.955555c-34.133333-28.444444-51.2-73.955556-51.2-119.46666699s22.755556-85.333333 56.888889-119.46666601l364.088889-312.888889c22.755556-22.755556 56.888889-17.066667 79.644445 5.688889 5.688889 11.377778 11.377778 28.444444 11.377777 39.822222z" fill="#999999" p-id="919"></path>
</svg>
</div>
<div class="right-historyBtn vHistoryBtn" title="${txt.rBtnTt}">
<svg t="1698507574371" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"
p-id="1067" xmlns:xlink="http://www.w3.org/1999/xlink" width="${
info.size - 6
}" height="${info.size - 6}">
<path d="M227.555556 910.222222c0-17.066667 5.688889-34.133333 17.066666-45.511111L614.4 551.822222c5.688889-11.377778 11.377778-17.066667 11.377778-34.133333 0-5.688889-5.688889-22.755556-11.377778-28.444445l-364.088889-329.955555c-22.755556-22.755556-22.755556-56.888889-5.688889-79.644445 22.755556-22.755556 56.888889-22.755556 79.644445-5.688888l364.088889 329.955555c34.133333 28.444444 51.2 73.955556 51.2 119.46666699s-22.755556 85.333333-56.888889 119.46666601l-364.088889 312.888889c-22.755556 22.755556-56.888889 17.066667-79.644445-5.688889-5.688889-11.377778-11.377778-28.444444-11.377777-39.822222z" fill="#999999" p-id="1068"></path>
</svg>
</div>
</div>`;
doms.btnBox.appendChild(dom);
doms.lBtn = doms.btnBox.querySelector(".left-historyBtn");
doms.rBtn = doms.btnBox.querySelector(".right-historyBtn");
}
// 历史按钮的相关函数
function historyBtns() {
const timer = setInterval(() => {
doms.btnBox = document.querySelector("." + classList.btnBox);
doms.btn = doms.btnBox && doms.btnBox.querySelector("." + classList.btn);
if (!doms.btnBox || !doms.btn) {
return;
}
createBtns();
if (!doms.lBtn || !doms.rBtn) {
return;
}
bindEvents();
clearInterval(timer);
}, 1000);
}
// 将dom转为string
function domToString(dom) {
let tmpDom = document.createElement("div");
tmpDom.appendChild(dom.cloneNode(true));
const str = tmpDom.innerHTML;
tmpDom = null;
return str;
}
// 将string转为dom对象
function strToDom(str) {
let tmpDom = document.createElement("div");
tmpDom.innerHTML = str;
const dom = tmpDom.children[0];
tmpDom = null;
return dom;
}
// 保存历史视频的数据
function saveVideos() {
const arr = [];
vHistory.forEach((vArr) => {
const curArr = [];
vArr.forEach((item) => {
curArr.push(domToString(item));
});
arr.push(curArr);
});
GM_setValue(info.storageHistVideos, JSON.stringify(arr));
}
// 加载历史视频的数据
function loadVideos() {
const value = GM_getValue(info.storageHistVideos);
if (!value) {
return;
}
vHistory = JSON.parse(value) || [];
vHistory.forEach((vArr) => {
vArr.forEach((item, i, arr) => {
arr[i] = strToDom(item);
});
});
info.index = vHistory.length;
info.hasCurVideos = false;
}
function showSetting() {
let newMaxHistory = +prompt(
txt.maxHistory + info.base_maxHistory,
info.maxHistory || info.base_maxHistory
);
if (newMaxHistory < 0) {
newMaxHistory = 5;
} else if (!newMaxHistory) {
newMaxHistory = info.maxHistory;
}
GM_setValue(info.storageMaxHist, newMaxHistory);
info.maxHistory = newMaxHistory;
info.isLoadVideo = confirm(
txt.isLoadVideo + (info.isLoadVideo ? "是 (确定)" : "否 (取消)")
);
GM_setValue(info.storageIsLoadVideo, info.isLoadVideo);
}
function bindEvents() {
doms.btn.addEventListener("click", () => {
if (info.index !== getMaxIndex()) {
vHistory.splice(info.index + 1, vHistory.length - 1 - info.index); // 不在最后则删除后面几组视频
info.index = getMaxIndex();
info.hasCurVideos = true;
}
if (info.index === getMaxIndex()) {
info.index++;
info.hasCurVideos = false;
}
updateHistory(); // 记录旧的一组视频
});
doms.lBtn.addEventListener("click", () => {
historyChange("left");
});
doms.rBtn.addEventListener("click", () => {
historyChange("right");
});
}
function main() {
// GM_setValue(info.storageHistVideos, "[]");
initValue();
getDoms();
if (!doms.vBox) {
return;
}
// updateHistory();
historyBtns();
GM_registerMenuCommand("设置", () => {
showSetting();
});
}
main();
})();