// ==UserScript== // @name 记录视频刷新历史(bilibili) // @namespace https://greasyfork.org/zh-CN/users/1196880-ling2ling4 // @version 1.1.6 // @author Ling2Ling4 // @description 记录每次刷新的视频, 可以方便的回溯之前错过的视频 // @license MIT // @icon data:image/png;base64,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 // @match *://www.bilibili.com/ // @match *://www.bilibili.com/?* // @match *://www.bilibili.com/index.html // @run-at document-end // @grant GM_setValue // @grant GM_getValue // @grant GM_registerMenuCommand // @noframes // @compatible chrome // @compatible edge // @compatible firefox // @downloadURL none // ==/UserScript== (() => { "use strict"; const info = { hoverColor: "#e3e5e7", hasCurVideos: !1, classList: { vBox: ["container", "no-banner-container", "is-version8"], video: "feed-card", addVideo: "add-video", btnBox: "feed-roll-btn", btn: "roll-btn", }, txt: { lBtnTt: "返回上一组视频", rBtnTt: "切换下一组视频" }, saveData: { histVideos: { key: "setting_histVideos", value: [], base: [], valType: "array", }, }, settings: { isLoadVideo: { value: !0, base: !0, key: "setting_isLoadVideo", txt: "每次打开B站首页时是否恢复上次关闭的页面的视频历史记录", type: "基础设置", valType: "boolean", compType: "radio", valueText: { true: "每次都加载旧的视频历史", false: "仅记录当前页面的视频历史", }, }, maxHistory: { value: 10, base: 10, key: "setting_maxHistory", txt: "设置历史视频的记录页数 (一般一页是10个视频)", type: "基础设置", valType: "number", compType: "textarea", compH: "30px", }, histBtnSize: { value: 20, base: 20, key: "setting_histBtnSize", txt: "设置按钮尺寸 (单位: 像素)", type: "基础设置", valType: "number", compType: "textarea", compH: "30px", }, }, settingsArea: null, }; function getValue({ base, key, valType = "string", isReSet = !0, getValue = null, setValue = null, getVal = null, setVal = null, } = {}) { getValue && (getVal = getValue), setValue && (setVal = setValue); let val = getVal ? getVal(key) : localStorage.getItem(key); return ( void 0 !== base && null == val && ((val = base), isReSet && ("string" != typeof base && (base = JSON.stringify(base)), setVal ? setVal(key, base) : localStorage.setItem(key, base))), (valType = valType.toLowerCase()), "string" == typeof val ? "string" === valType ? val : "boolean" === valType || "number" === valType ? JSON.parse(val) : "object" === valType ? val ? JSON.parse(val) : {} : "array" === valType ? val ? JSON.parse(val) : [] : val : val ); } function getData() { const settings = info.settings; for (const valName in settings) { const setting = settings[valName]; setting.value = getValue({ base: setting.base, key: setting.key, valType: setting.valType, getVal: GM_getValue, setVal: GM_setValue, }); } const saveData = info.saveData; for (const valName in saveData) { if ("histVideos" === valName && !settings.isLoadVideo.value) break; const setting = saveData[valName]; setting.value = getValue({ base: setting.base, key: setting.key, valType: setting.valType, getVal: GM_getValue, setVal: GM_setValue, }); } return info.settings; } info.keyBase = "setting_"; const baseCfg = { isEditing: !1, hasSelectedPage: !1, param: { id: "ll_edit_wrap", box: document.body, classBase: "ll_edit_", w: "500px", h: "", contentH: "450px", bg: "rgba(0, 0, 0, 0.15)", color: "#333", fontSize: "15px", fontFamily: "PingFang SC, HarmonyOS_Regular, Helvetica Neue, Microsoft YaHei, sans-serif", zIndex: 11e3, resetTt: "重置所有设置为默认值", isShowMenu: !1, isScrollStyle: !0, isResetBtn: !0, isOnlyResetCurPage: !1, showPage: void 0, page: [], }, }, cfg = { version: "v1.1.0", isEditing: baseCfg.isEditing, hasSelectedPage: baseCfg.hasSelectedPage, param: {}, tempParam: {}, allData: {}, baseData: {}, oldData: {}, controls: {}, doms: { page: [] }, editText: {}, callback: { resetBefore: null, confirmBefore: null, finished: null }, }; const css = function getCss() { const param = cfg.param, cBase = (param.page, param.classBase), baseStart = `#${param.id} .${cBase}`, fSize = param.fontSize ? param.fontSize : "14px", css = `#${ param.id } {\n position: fixed;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n z-index: ${ param.zIndex || 11e3 };\n background: ${ param.bg || "rgba(0, 0, 0, 0.12)" };\n display: none;\n}\n${baseStart}box {\n position: relative;\n width: ${ param.w || "450px" };\n ${ param.h ? "max-height:" + param.h : "" };\n margin: auto;\n color: ${ param.color || "#333" };\n background: #fff;\n font-size: ${fSize};\n line-height: normal;\n font-family: ${ param.fontFamily || "PingFang SC, HarmonyOS_Regular, Helvetica Neue, Microsoft YaHei, sans-serif" };\n border: 3px solid #dfedfe;\n border-radius: 10px;\n box-sizing: border-box;\n padding: 14px 8px 10px 15px;\n overflow: hidden;\n overflow-y: auto;\n}\n${baseStart}menu {\n font-weight: bold;\n font-size: ${ parseInt(fSize) + 1 }px;\n display: flex;\n flex-wrap: wrap;\n gap: 0 8px;\n}\n${baseStart}menu-item {\n margin-bottom: 8px;\n border: 1px solid #dfedfe;\n color: #9ecaff;\n background: #eef6ff;\n border-radius: 6px;\n padding: 6px 10px;\n cursor: pointer;\n}\n${baseStart}menu-item:hover {\n color: #65aaff;\n background: #dfedfe;\n border: 1px solid #dfedfe;\n}\n${baseStart}menu-item.active {\n color: #65aaff;\n background: #dfedfe;\n border: 1px solid #dfedfe;\n}\n${baseStart}page-box {\n max-height: ${ param.contentH || "" };\n padding-right: 7px;\n margin-bottom: 8px;\n overflow: hidden;\n overflow-y: auto;\n}\n${baseStart}page {\n display: none;\n}\n${baseStart}page.curPage {\n display: block;\n}\n${baseStart}comp {\n margin-bottom: 8px;\n}\n${baseStart}comp:last-child {\n margin-bottom: 2px;\n}\n${baseStart}tt {\n font-weight: bold;\n font-size: ${ parseInt(fSize) + 5 }px;\n margin-bottom: 10px;\n}\n${baseStart}tt2 {\n font-weight: bold;\n font-size: ${ parseInt(fSize) + 3 }px;\n margin-bottom: 9px;\n}\n${baseStart}tt3 {\n font-weight: bold;\n font-size: ${ parseInt(fSize) + 1 }px;\n}\n${baseStart}desc {\n line-height: 1.5;\n}\n${baseStart}comp-tt {\n font-weight: bold;\n line-height: 1.5;\n}\n${baseStart}comp-desc {\n line-height: 1.5;\n}\n${baseStart}rd-arr {\n line-height: 22px;\n}\n${baseStart}rd-arr label {\n margin-right: 6px;\n cursor: pointer;\n}\n${baseStart}rd-arr input {\n vertical-align: -2px;\n cursor: pointer;\n}\n${baseStart}rd-arr span {\n color: #666;\n margin-left: 2px;\n}\n#${ param.id } textarea {\n width: 100%;\n max-width: 100%;\n max-height: 300px;\n border-radius: 6px;\n line-height: normal;\n padding: 5px 7px;\n outline-color: #cee4ff;\n border: 1px solid #aaa;\n box-sizing: border-box;\n font-size: ${ parseInt(fSize) - 2 }px;\n font-family: PingFang SC, HarmonyOS_Regular, Helvetica Neue, Microsoft YaHei, sans-serif;\n /* 保留空格 */\n white-space: pre-wrap;\n /* 允许词内换行 */\n word-break: break-all;\n letter-spacing: 1px;\n overflow: hidden;\n overflow-y: auto;\n}\n#${ param.id } textarea::placeholder {\n color: #bbb;\n}\n${baseStart}ta-desc {\n margin-bottom: 3px;\n}\n${baseStart}btn-box {\n display: flex;\n justify-content: flex-end;\n}\n${baseStart}btn-box button {\n font-size: 16px;\n line-height: normal;\n color: #65aaff;\n background: #dfedfe;\n outline: none;\n border: none;\n border-radius: 6px;\n padding: 8px 16px;\n box-sizing: border-box;\n cursor: pointer;\n}\n${baseStart}btn-box .${cBase}reset-btn {\n position: absolute;\n left: 15px;\n bottom: 10px;\n color: #888;\n background: #f4f4f4;\n margin-right: 15px;\n}\n${baseStart}btn-box .${cBase}reset-btn:hover {\n color: #666;\n background: #eee;\n}\n${baseStart}btn-box .${cBase}cancel-btn {\n color: #888;\n background: #f4f4f4;\n margin-right: 15px;\n}\n${baseStart}btn-box .${cBase}cancel-btn:hover {\n color: #666;\n background: #eee;\n}\n${baseStart}btn-box .${cBase}confirm-btn {\n margin-right: 7px;\n}\n${baseStart}btn-box .${cBase}confirm-btn:hover {\n background: #cee4ff;\n}\n`; return param.isScrollStyle ? css + "\n.ll-scroll-style-1::-webkit-scrollbar,\n.ll-scroll-style-1 ::-webkit-scrollbar {\n width: 8px;\n}\n.ll-scroll-style-1-size-2::-webkit-scrollbar,\n.ll-scroll-style-1 .ll-scroll-style-1-size-2::-webkit-scrollbar {\n width: 10px;\n}\n.ll-scroll-style-1-size-3::-webkit-scrollbar,\n.ll-scroll-style-1 .ll-scroll-style-1-size-3::-webkit-scrollbar {\n width: 12px;\n}\n.ll-scroll-style-1::-webkit-scrollbar-thumb,\n.ll-scroll-style-1 ::-webkit-scrollbar-thumb {\n border-radius: 10px;\n -webkit-box-shadow: inset 0 0 8px rgba(0, 0, 0, 0.05);\n opacity: 0.2;\n background: #daedff;\n}\n.ll-scroll-style-1::-webkit-scrollbar-track,\n.ll-scroll-style-1 ::-webkit-scrollbar-track {\n -webkit-box-shadow: inset 0 0 8px rgba(0, 0, 0, 0.08);\n border-radius: 0;\n background: #fff;\n border-radius: 5px;\n}" : css; }; const editArea_html = function getHTML() { function getCompHTML({ info, active = "", id }) { let type = info.type; if ( ((type = { menuTitle: "mtt", title: "tt", title2: "tt2", title3: "tt3", desc: "ds", radio: "rd", checkbox: "cb", textarea: "ta", mtt: "mtt", tt: "tt", tt2: "tt2", tt3: "tt3", ds: "ds", rd: "rd", cb: "cb", ta: "ta", }[type]), (id = 0 === id ? "0" : id || ""), 0 === info.value && (info.value = "0"), !type) ) return console.log("不存在的组件类型"), !1; let title = "", desc = "", ctrlTt = ""; switch ( (["tt", "tt2", "tt3", "ds", "mtt"].includes(type) || ((title = info.title ? `
${info.title}
` : ""), (desc = info.desc ? `
${info.desc}
` : "")), type) ) { case "mtt": return ( (info.value = info.value || ""), info.value ? `
${info.value}
` : "" ); case "tt": case "tt2": case "tt3": return ( (info.value = info.value || ""), info.value ? `
${info.value}
` : "" ); case "ds": return ( (info.value = info.value || ""), info.value ? `
${info.value}
` : "" ); case "rd": const name = info.name || info.id + new Date().getTime(); (ctrlTt = info.ctrlTt || ""), ctrlTt && (ctrlTt = `title="${ctrlTt}"`); let radio = `
`; if (void 0 === info.value && info.radioList[0]) { const obj = info.radioList[0]; info.value = void 0 === obj.value ? obj.text : obj.value; } return ( info.radioList.forEach((item, i) => { void 0 === item.value && (info.radioList[i].value = item.text), void 0 === item.text && (info.radioList[i].text = item.value); const value = item.value; let tt = item.tt || ""; tt && (tt = `title="${tt}"`); let selected = ""; info.value + "" == item.value + "" && (selected = "checked"), (radio += ``); }), (radio += "
"), `
${title}${desc}${radio}
` ); case "cb": const name2 = info.name || new Date().getTime(); if ( ((ctrlTt = info.ctrlTt || ""), ctrlTt && (ctrlTt = `title="${ctrlTt}"`), void 0 === info.value && info.radioList[0]) ) { const obj = info.radioList[0]; info.value = void 0 === obj.value ? obj.text : obj.value; } let checkbox = `
`; return ( info.radioList.forEach((item, i) => { void 0 === item.value && (info.radioList[i].value = item.text), void 0 === item.text && (info.radioList[i].text = item.value); const value = item.value; let tt = item.tt || ""; tt && (tt = `title="${tt}"`); let selected = ""; info.value.includes(value) && (selected = "checked"), (checkbox += ``); }), (checkbox += "
"), `
${title}${desc}${checkbox}
` ); case "ta": const style = `style="${ info.width ? "width:" + info.width + ";" : "" }${info.height ? "height:" + info.height + ";" : ""}${ info.fontSize ? "font-size:" + info.fontSize + ";" : "" }${info.fontFamily ? "font-family:" + info.fontFamily + ";" : ""}"`, textarea = ``; return `
${title}${desc}${textarea}
`; } } const param = cfg.param, page = param.page, cBase = param.classBase, isMenu = 1 !== page.length; let menu = `
`, pageHTML = `
`; page.forEach((curPage, index) => { let pgid = curPage.id || index; (pgid += ""), (cfg.allData[pgid] = {}), (cfg.baseData[pgid] = {}); let pageFlag = ""; if ( (cfg.hasSelectedPage || ((void 0 === param.showPage || pgid === param.showPage + "") && ((pageFlag = "curPage"), (cfg.hasSelectedPage = !0))), (pageHTML += `
`), curPage.components) ) { let compIndex = 0; if (isMenu || param.isShowMenu) { let curMenu = curPage.components.find( (item) => "menuTitle" === item.type ); curMenu || (curMenu = { type: "menuTitle", value: pgid }), (menu += getCompHTML({ info: curMenu, active: pageFlag ? "active" : "", })); } curPage.components.forEach((item) => { const cpid = item.id || compIndex; "menuTitle" !== item.type && (pageHTML += getCompHTML({ info: item, id: cpid })), ["title", "title2", "title3", "desc", "menuTitle"].includes( item.type ) || ((item.base = void 0 === item.base ? item.value : item.base), (cfg.allData[pgid][cpid] = item.value), (cfg.baseData[pgid][cpid] = item.base), compIndex++); }); } pageHTML += "
"; }), (pageHTML += "
"), isMenu || param.isShowMenu ? (menu += "
") : (menu = ""); const resetBtn = param.isResetBtn ? `` : "", btnBox = `
\n${resetBtn}\n\n\n
`; return `
\n${menu}\n${pageHTML}\n${btnBox}\n
`; }; let param = cfg.param; const baseParam = baseCfg.param, allData = cfg.allData, controls = cfg.controls, doms = cfg.doms; function createEditEle({ id = baseParam.id, box = baseParam.box, classBase = baseParam.classBase, w = baseParam.w, h = baseParam.h, contentH = baseParam.contentH, bg = baseParam.bg, color = baseParam.color, fontSize = baseParam.fontSize, fontFamily = baseParam.fontFamily, zIndex = baseParam.zIndex, resetTt = baseParam.resetTt, isShowMenu = baseParam.isShowMenu, isScrollStyle = baseParam.isScrollStyle, isResetBtn = baseParam.isResetBtn, isOnlyResetCurPage = baseParam.isOnlyResetCurPage, showPage = baseParam.showPage, page = [], } = {}) { (cfg.isEditing = baseCfg.isEditing), (cfg.hasSelectedPage = baseCfg.hasSelectedPage), (cfg.param = { ...baseParam }), (param = cfg.param), (param.id = id), (param.box = box), (param.classBase = classBase), (param.w = w), (param.h = h), (param.contentH = contentH), (param.bg = bg), (param.color = color), (param.fontSize = fontSize), (param.fontFamily = fontFamily), (param.zIndex = zIndex), (param.resetTt = resetTt), (param.isShowMenu = isShowMenu), (param.isScrollStyle = isScrollStyle), (param.isResetBtn = isResetBtn), (param.isOnlyResetCurPage = isOnlyResetCurPage), (param.showPage = showPage), (param.page = page); const html = editArea_html(); return ( box.querySelector(`#${param.classBase}${param.id}-css`) || (function addCss(cssText, box = document.body, id = "") { const style = document.createElement("style"); return ( id && (style.id = id), box.appendChild(style), (style.innerHTML = cssText), style ); })(css(), box, param.classBase + param.id + "-css"), (doms.wrap = (function createEle({ className = "", id = "", title = "", css, box = document.body, type = "div", } = {}) { const ele = document.createElement(type); return ( id && (ele.id = id), className && (ele.className = className), title && (ele.title = title), css && (ele.style.cssText = css), box.appendChild(ele), ele ); })({ className: id, id })), (doms.wrap.innerHTML = html), (function getDoms() { const cBase = param.classBase; (doms.box = doms.wrap.querySelector(`.${cBase}box`)), (doms.cancel = doms.box.querySelector(`.${cBase}cancel-btn`)), (doms.confirm = doms.box.querySelector(`.${cBase}confirm-btn`)); const isMenu = 1 !== param.page.length; (isMenu || param.isShowMenu) && ((doms.menu = doms.box.querySelector(`.${cBase}menu`)), (doms.menus = [].slice.call( doms.menu.querySelectorAll(`.${cBase}menu-item`) ))); const pages = [].slice.call(doms.box.querySelectorAll(`.${cBase}page`)); (doms.page = []), param.isResetBtn && (doms.reset = doms.box.querySelector(`.${cBase}reset-btn`)); pages.forEach((curPage, index) => { cfg.hasSelectedPage || (curPage.classList.add("curPage"), (isMenu || param.isShowMenu) && doms.menus[0].classList.add("active"), (cfg.hasSelectedPage = !0)); const page = {}, pgid = curPage.dataset.pgid; (page.pgid = curPage.pgid = pgid), (page.controls = [].slice.call( curPage.querySelectorAll(`.${cBase}ctrl`) )), (page.ele = curPage), doms.page.push(page), (isMenu || param.isShowMenu) && (doms.menus[index].settingsPage = curPage); const ctrls = {}; (controls[pgid] = ctrls), page.controls.forEach((item, i) => { const cpid = item.dataset.cpid, cType = item.dataset.type; let dom; (item.cpid = cpid), "rd" === cType || "cb" === cType ? ((dom = [].slice.call(item.querySelectorAll("input"))), (dom.compType = cType)) : "ta" === cType && ((dom = item.querySelector("textarea")), (dom.compType = cType), (dom.value = allData[pgid][cpid])), (ctrls[cpid] = dom); }); }); })(), (function bindEvents() { function menuHandle(e) { const dom = e.target, cBase = param.classBase; if (dom.classList.contains(`${cBase}menu-item`)) { const old = doms.menu.querySelector(".active"); old.classList.remove("active"), old.settingsPage.classList.remove("curPage"), dom.classList.add("active"), dom.settingsPage.classList.add("curPage"); } } function cancelEdit(e) { const cBase = param.classBase; (e.target.className !== `${cBase}wrap` && e.target.className !== `${cBase}cancel-btn`) || (showEditArea(!1), setCompValue(cfg.oldData)); } function confirmEdit() { const callback = cfg.callback, data = getAllData(); if (((cfg.allData = data), callback.confirmBefore)) { let result; const func = callback.confirmBefore; if ( (Array.isArray(func) ? func.curFn ? ((result = func[curFn](data)), (func.curFn = null)) : func.forEach((fn) => { result = fn(data); }) : (result = func(data)), !1 === result) ) return; } if ((showEditArea(!1), callback.finished)) { const func = callback.finished; Array.isArray(func) ? func.curFn ? (func[curFn](data), (func.curFn = null)) : func.forEach((fn) => { fn(data); }) : func(data); } } function resetEdit() { const callback = cfg.callback, data = getAllData(); if (callback.resetBefore) { let result; const func = callback.resetBefore; if ( (Array.isArray(func) ? func.curFn ? ((result = func[curFn](data)), (func.curFn = null)) : func.forEach((fn) => { result = fn(data); }) : (result = func(data)), !1 === result) ) return; } !(function resetEditData(data = null) { if (param.isResetBtn) if (param.isOnlyResetCurPage) { data = data || getAllData(); const curMenu = doms.menu.querySelector(".active"); (data[curMenu.innerText] = cfg.baseData[curMenu.innerText]), setCompValue(data); } else setCompValue(cfg.baseData); })(data); } doms.menu && doms.menu.addEventListener("click", menuHandle), doms.wrap.addEventListener("click", cancelEdit), doms.cancel.addEventListener("click", cancelEdit), doms.confirm.addEventListener("click", confirmEdit), doms.reset && doms.reset.addEventListener("click", resetEdit); })(), cfg ); } function getAllData() { function getCompItem(pgid, cpid) { if (!controls[pgid]) return; const ctrl = controls[pgid][cpid]; if (ctrl) { if (!Array.isArray(ctrl)) return ctrl.value; if ("rd" === ctrl.compType) { return ctrl.find((item) => item.checked).dataset.val; } if ("cb" === ctrl.compType) { return ctrl .filter((item) => item.checked) .map((item) => item.dataset.val); } } } const data = {}; if (0 === arguments.length) { for (const key in controls) { const page = controls[key]; data[key] = {}; for (const key2 in page) data[key][key2] = getCompItem(key, key2); } return data; } if (1 === arguments.length) { const ctrls = arguments[0]; for (const pgid in ctrls) { data[pgid] = {}; controls[pgid].forEach((cpid) => { data[pgid][cpid] = getCompItem(pgid, cpid); }); } return allData; } return getCompItem(arguments[0], arguments[1]); } function setCompValue() { function setCompItem(pgid, cpid, value) { if (!controls[pgid]) return; const ctrl = controls[pgid][cpid]; if (ctrl) if (Array.isArray(ctrl)) { if ("rd" === ctrl.compType) { const selected = ctrl.find((item) => item.checked); selected && (selected.checked = !1); const select = ctrl.find((item) => item.dataset.val === value + ""); select && (select.checked = !0); } else if ("cb" === ctrl.compType) { if ( (ctrl .filter((item) => item.checked) .forEach((item) => { item.checked = !1; }), Array.isArray(value)) ) value.forEach((val) => { const select = ctrl.find( (item) => item.dataset.val === val + "" ); select && (select.checked = !0); }); else { const select = ctrl.find( (item) => item.dataset.val === value + "" ); select && (select.checked = !0); } } } else ctrl.value = value; } if (1 === arguments.length) { const data = arguments[0]; for (const key in data) { const pageData = data[key]; for (const key2 in pageData) { setCompItem(key, key2, pageData[key2]); } } } else { setCompItem(arguments[0], arguments[1], arguments[2]); } } function showEditArea(isShow = !0, callback = null) { if ( isShow && ((cfg.oldData = getAllData()), "function" == typeof callback) ) { if (!1 === callback(cfg.oldData)) return; } (cfg.isEditing = isShow), (doms.wrap.style.display = isShow ? "block" : "none"), isShow && !doms.box.style.top && (doms.box.style.top = window.innerHeight / 2 - doms.box.clientHeight / 2 + "px"), callback && (cfg.callback = callback); } function setValue({ value, base, key, verification = null, getValue = null, setValue = null, getVal = null, setVal = null, } = {}) { getValue && (getVal = getValue), setValue && (setVal = setValue); let newVal = value, val = getVal ? getVal(key) : localStorage.getItem(key); return ( void 0 !== base && null == val && ((val = base), "string" != typeof base && (base = JSON.stringify(base)), setVal ? setVal(key, base) : localStorage.setItem(key, base)), null !== newVal && ("function" != typeof verification || ((newVal = verification(newVal, val)), null !== newVal)) && newVal !== val && ("string" != typeof newVal && (newVal = JSON.stringify(newVal)), setVal ? setVal(key, newVal) : localStorage.setItem(key, newVal), !0) ); } const settings = info.settings, videoHist_info = { maxHistory: null, isLoadVideo: null, size: null, histVideos: null, hoverColor: info.hoverColor, loadNum: 0, index: 0, hasCurVideos: !1, }, txt = { lBtnTt: info.txt.lBtnTt, rBtnTt: info.txt.rBtnTt }, classList = info.classList, videoHist_doms = {}; let vHistory = []; function updateData() { (videoHist_info.maxHistory = settings.maxHistory.value), (videoHist_info.isLoadVideo = settings.isLoadVideo.value), (videoHist_info.size = parseInt(settings.histBtnSize.value)), videoHist_info.isLoadVideo && ((videoHist_info.histVideos = info.saveData.histVideos.value), (function loadVideos() { (vHistory = videoHist_info.histVideos), vHistory.forEach((vArr) => { vArr.forEach((item, i, arr) => { arr[i] = (function strToDom(str) { let tmpDom = document.createElement("div"); tmpDom.innerHTML = str; const dom = tmpDom.children[0]; return (tmpDom = null), dom; })(item); }); }), (videoHist_info.index = vHistory.length), (videoHist_info.hasCurVideos = !1); })()); } function getMaxIndex() { return vHistory.length - 1 + (videoHist_info.hasCurVideos ? 0 : 1); } function getVideos() { let arr; arr = [].slice.call( videoHist_doms.vBox.querySelectorAll("." + classList.video) ); const addVideos = videoHist_doms.vBox.querySelectorAll( "." + classList.addVideo ); return ( addVideos.length > 0 && (arr = arr.concat([].slice.call(addVideos))), (arr = arr.filter((i) => "none" !== i.style.display)), (videoHist_doms.curVideos = arr), arr ); } function updateHistory() { if ( ((videoHist_doms.curVideos = getVideos()), !vHistory[vHistory.length - 1] || videoHist_doms.curVideos[0] !== vHistory[vHistory.length - 1][0]) ) return ( vHistory.push(videoHist_doms.curVideos), videoHist_info.index === vHistory.length - 1 && (videoHist_info.hasCurVideos = !0), vHistory.length > videoHist_info.maxHistory && (vHistory.splice(0, 1), videoHist_info.index--), videoHist_info.isLoadVideo && (function saveVideos() { const arr = []; vHistory.forEach((vArr) => { const curArr = []; vArr.forEach((item) => { curArr.push( (function domToString(dom) { let tmpDom = document.createElement("div"); tmpDom.appendChild(dom.cloneNode(!0)); const str = tmpDom.innerHTML; return (tmpDom = null), str; })(item) ); }), arr.push(curArr); }), setValue({ value: JSON.stringify(arr), base: "", key: info.saveData.histVideos.key, getValue: GM_getValue, setValue: GM_setValue, }); })(), !0 ); } function historyChange(f = "left") { if ( (videoHist_info.hasCurVideos || videoHist_info.index !== vHistory.length - 1 + 1 || updateHistory(), "right" === f) ) { if ((videoHist_info.index++, videoHist_info.index > vHistory.length - 1)) return void (videoHist_info.index = vHistory.length - 1); } else if ((videoHist_info.index--, videoHist_info.index < 0)) return void (videoHist_info.index = 0); !(function delCurVideos() { getVideos().forEach((ele) => { ele.remove(); }); })(); const twoVideo = videoHist_doms.vBox.children[1]; vHistory[videoHist_info.index].forEach((ele) => { videoHist_doms.vBox.insertBefore(ele, twoVideo); }); } function historyBtns() { let i = 0; const timer = setInterval(() => { i >= 5 && clearInterval(timer), i++, (videoHist_doms.btnBox = document.querySelector( "." + classList.btnBox )), (videoHist_doms.btn = videoHist_doms.btnBox && videoHist_doms.btnBox.querySelector("." + classList.btn)), videoHist_doms.btnBox && videoHist_doms.btn && (!(function createBtns() { const dom = document.createElement("div"); (dom.innerHTML = `
\n \n
\n \n \n \n
\n
\n \n \n \n
\n
`), videoHist_doms.btnBox.appendChild(dom), (videoHist_doms.lBtn = videoHist_doms.btnBox.querySelector(".left-historyBtn")), (videoHist_doms.rBtn = videoHist_doms.btnBox.querySelector(".right-historyBtn")); })(), videoHist_doms.lBtn && videoHist_doms.rBtn && (!(function videoHist_bindEvents() { videoHist_doms.btn.addEventListener("click", () => { videoHist_info.index !== getMaxIndex() && (vHistory.splice( videoHist_info.index + 1, vHistory.length - 1 - videoHist_info.index ), (videoHist_info.index = getMaxIndex()), (videoHist_info.hasCurVideos = !0)), videoHist_info.index === getMaxIndex() && (videoHist_info.index++, (videoHist_info.hasCurVideos = !1)), updateHistory(); }), videoHist_doms.lBtn.addEventListener("click", () => { historyChange("left"); }), videoHist_doms.rBtn.addEventListener("click", () => { historyChange("right"); }), window.addEventListener("beforeunload", () => { videoHist_info.index === getMaxIndex() && updateHistory(); }); })(), clearInterval(timer))); }, 1e3); } function toPageObj({ settings, param = {}, otherPageName = "无分类" } = {}) { param = { ...param }; const pageArr = [], menuList = []; let isOtherType = !1; for (let key in settings) { const item = settings[key]; item.type ? menuList.includes(item.type) || menuList.push(item.type) : isOtherType || (isOtherType = !0); } return ( isOtherType && menuList.push(otherPageName), menuList.forEach((menuTt) => { const components = [], page = { id: menuTt, components }, arr = []; for (let key in settings) { const item = settings[key]; menuTt === otherPageName ? item.type || arr.push(item) : item.type === menuTt && arr.push(item); } arr.forEach((item) => { let desc = item.desc || item.txt || ""; desc && (desc = desc.replaceAll("\n", "
").trim()); let comp, base = item.base; if ( (Array.isArray(base) && (base = base.join(", ")), item.groupTitle1) ) { const comp = { id: item.key + "-gTt1", type: "title", value: item.groupTitle1, }; components.push(comp); } if (item.groupTitle2) { const comp = { id: item.key + "-gTt2", type: "title2", value: item.groupTitle2, }; components.push(comp); } if (item.groupTitle3) { const comp = { id: item.key + "-gTt3", type: "title3", value: item.groupTitle3, }; components.push(comp); } if (item.groupDesc) { const comp = { id: item.key + "-gDesc", type: "desc", value: item.groupDesc, }; components.push(comp); } if ( (["menuTitle", "title", "desc", "title2", "title3"].includes( item.compType ) ? ((comp = { ...item }), (comp.type = comp.compType), (comp.desc = desc)) : (comp = { id: item.key, type: item.compType, tt: item.tt || "", title: item.title || "", desc, descTt: item.descTt || "", name: item.key, value: item.value, base: item.base, }), "textarea" === comp.type) ) (comp.ph = base), (comp.width = item.compW), (comp.height = item.compH), (comp.ctrlTt = "默认: " + base); else if ("radio" === comp.type || "checkbox" === comp.type) { let str = "默认: "; if ("checkbox" === comp.type) { let arr = item.base; Array.isArray(arr) || (arr = arr.split(/,|,/)), arr.forEach((val, i) => { 0 !== i && (str += ", "), (val = val.trim()); let valTxt = item.valueText[val]; void 0 === valTxt && (valTxt = val), (str += valTxt); }); } else { let val = item.valueText[item.base]; void 0 === val && (val = item.base), (str += val); } comp.ctrlTt = str; } if (item.valueText) { comp.radioList = []; for (let key in item.valueText) { const rd = { text: item.valueText[key], value: key }; comp.radioList.push(rd); } } components.push(comp); }), pageArr.push(page); }), (param.page = pageArr), param ); } function showSettings() { const settings = info.settings; (info.settingsArea = (function createEdit({ settings, param = {}, oldEditCfg, updateDataFn, isNewEdit = !0, isSyncOtherPage = !0, otherPageName = "无分类", } = {}) { let oldSettings, curSettings; updateDataFn && isSyncOtherPage && ((oldSettings = JSON.stringify(settings)), (settings = updateDataFn() || settings), (curSettings = JSON.stringify(settings))); const editInfo = { settings, param, otherPageName }; if (oldEditCfg) { if (isNewEdit) return ( oldEditCfg.doms.wrap.remove(), createEditEle(toPageObj(editInfo)) ); isSyncOtherPage && updateDataFn && oldSettings !== curSettings && (oldEditCfg.doms.wrap.remove(), (oldEditCfg = createEditEle(toPageObj(editInfo)))), isSyncOtherPage && !updateDataFn && (oldEditCfg.doms.wrap.remove(), (oldEditCfg = createEditEle(toPageObj(editInfo)))); } else oldEditCfg = createEditEle(toPageObj(editInfo)); return oldEditCfg; })({ settings, param: { isShowMenu: !0 }, oldEditCfg: info.settingsArea, updateDataFn: getData, })), updateData(); showEditArea(!0, { resetBefore: () => {}, confirmBefore: () => {}, finished: (data) => { console.log(data); if ( (function isValueChange() { const curData = getAllData(); return JSON.stringify(curData) !== JSON.stringify(cfg.oldData); })() ) { for (const pageName in data) { const page = data[pageName]; for (const key in page) { const value = page[key]; let verifyFn; const flag = key.replace(info.keyBase, ""), item = settings[flag]; switch (key) { case settings.isLoadVideo.key: break; case settings.maxHistory.key: verifyFn = (newVal) => (newVal = +newVal) < 1 || !newVal ? settings.maxHistory.base : newVal; break; case settings.histBtnSize.key: verifyFn = (newVal) => (newVal = parseInt(newVal)) < 10 || !newVal ? settings.histBtnSize.base : newVal; } if (!item) return void console.log("设置的数据对应的对象获取失败"); setValue({ value, base: item.base, key, verification: verifyFn, getValue: GM_getValue, setValue: GM_setValue, }); } } history.go(0); } }, }); } getData(), GM_registerMenuCommand("设置", () => { showSettings(); }), (function main() { videoHist_info.loadNum++, videoHist_info.loadNum > 3 ? console.log("视频元素的容器元素获取失败") : (updateData(), (function videoHist_getDoms() { if ( ("string" == typeof classList.vBox ? (videoHist_doms.vBox = document.querySelector( "." + classList.vBox )) : classList.vBox.forEach((item) => { !videoHist_doms.vBox && (videoHist_doms.vBox = document.querySelector( "." + item )); }), !videoHist_doms.vBox) ) { const dom = document.querySelector("." + classList.video); if ( (dom && (videoHist_doms.vBox = dom.parentElement), !videoHist_doms.vBox) ) return; } })(), videoHist_doms.vBox ? historyBtns() : setTimeout(() => { main(); }, 500)); })(); })();