// ==UserScript== // @license MIT // @name 简单的青柠起始页优化 // @namespace https://bbs.tampermonkey.net.cn/ // @version 0.4.0 // @description 默认去掉青柠起始页的页脚,使用 alt + t 控制搜索框的显示隐藏 使用alt + g切换时钟显示隐藏,变量全局存储,不需要每次打开都关闭或者显示了 alt+b 显示隐藏 B站热搜 // @author Hei // @match *://limestart.cn/* // @grant GM_setClipboard // @grant unsafeWindow // @grant GM_xmlhttpRequest // @grant GM_addStyle // @grant GM_getResourceText // @grant GM_getResourceURL // @connect api.bilibili.com // @connect at.alicdn.com // @connect i0.hdslb.com // @connect * // @require https://lib.baomitu.com/jquery/1.12.4/jquery.min.js // @resource css https://at.alicdn.com/t/c/font_4423350_7t2u8i9k77r.css // ==/UserScript== (function () { 'use strict'; const indexDBREQ = window.indexedDB.open("limestart", 1) // 数据库名称,版本号 const storeName = 'wallpaper' // 表名 let local_db = null; indexDBREQ.onupgradeneeded = (event) => { local_db = event.target.result // 数据库对象 if (local_db.objectStoreNames.includes(storeName)) { local_db.deleteObjectStore(storeName) local_db.createObjectStore(storeName) } console.log('upgrad-连接到本地limestart数据库') } indexDBREQ.onsuccess = (event) => { // 监听数据库创建成功事件 local_db = event.target.result // 数据库对象 console.log('连接到本地limestart数据库') } const indexedAction = { get(storeName, key) { return new Promise((res) => { const transaction = local_db.transaction([storeName], "readwrite"); const store = transaction.objectStore(storeName); const r = store.get(key) r.onsuccess = (e) => { res(e.target.result) } r.onerror = (e) => { res(null) } }) }, put(val, key) { return new Promise((res) => { const transaction = local_db.transaction([storeName], "readwrite"); const store = transaction.objectStore(storeName); const r = store.put(val, key) r.onsuccess = (e) => { res(true) } r.onerror = (e) => { res(false) } }) }, delete(key) { return new Promise((res) => { const transaction = local_db.transaction([storeName], "readwrite"); const store = transaction.objectStore(storeName); const r = store.delete(key) r.onsuccess = (e) => { res(true) } r.onerror = (e) => { res(false) } }) } } // 基础依赖 const _mainKey = 'easy_limestart' const ls = { set(key, val) { let easy_limestart_obj = window.localStorage.getItem(_mainKey); if (!easy_limestart_obj) { easy_limestart_obj = {} } else { easy_limestart_obj = JSON.parse(easy_limestart_obj) } easy_limestart_obj[key] = val; window.localStorage.setItem(_mainKey, JSON.stringify(easy_limestart_obj)) }, get(key, defaultVal = null) { let easy_limestart_obj = window.localStorage.getItem(_mainKey); if (!easy_limestart_obj) { easy_limestart_obj = {} return defaultVal } else { easy_limestart_obj = JSON.parse(easy_limestart_obj) } const val = easy_limestart_obj[key]; if (val !== undefined) { try { return JSON.parse(val) } catch (err) { return defaultVal || val } } return defaultVal } } //消息弹窗 const Message = { info(msg) { const delay = 2000; //多少毫秒后隐藏 const greetingContainer = document.createElement("div") greetingContainer.id = "greetingContainer" const greetingBox = document.createElement("div") greetingBox.id = "greetingBox" greetingBox.textContent = msg greetingContainer.append(greetingBox) document.body.append(greetingContainer) greetingContainer.offsetLeft; // reflow greetingBox.style.opacity = 1 greetingBox.style.transform = `translateY(0)` setTimeout(() => { greetingBox.style.opacity = 0; greetingBox.style.transform = `translateY(-100%)`; greetingBox.addEventListener("transitionend", () => { greetingContainer.remove(); }) greetingBox.addEventListener("webkitTransitionEnd", () => { greetingContainer.remove(); }) }, delay) } } // 加载B站热搜 // 去除脚标 const timer = setInterval(() => { const footer = document.querySelector("footer"); if (footer) { footer.style.display = 'none' clearInterval(timer) } }, 500); /** * 显示/隐藏搜索框 */ function showSearchCb() { const searchSuggestionContainer = document.getElementById("searchSuggestionContainer"); const menuSearchEng = document.getElementById("menuSearchEng"); const searchEl = document.getElementById("searchBar"); if (searchEl) { searchEl.style.display = showSearch ? 'block' : 'none'; } if (searchSuggestionContainer) { searchSuggestionContainer.style.display = showSearch ? 'block' : 'none'; } if (menuSearchEng) { menuSearchEng.style.display = showSearch ? 'block' : 'none'; } } let showSearch = ls.get("showSearch"); showSearchCb(); // 如果隐藏输入框,那就失去焦点 + 不要cover if (!showSearch) { document.getElementById("inputSearch").blur() document.getElementById("cover").click() } // 显示/隐藏时间框 let showTimer = ls.get("showTimer", true) function showTimerCb() { const timeContainer = document.getElementById("timeContainer"); if (timeContainer) { timeContainer.style.display = showTimer ? 'block' : 'none'; } } showTimerCb() let showBilibili = false; let isBliLoading = false; //B站热搜请求 function requestBiApi() { const getRow = async (show_name, keyword, icon) => { const src = await (new Promise((res) => { if (icon) { GM_xmlhttpRequest({ url: icon, method: 'get', responseType: 'blob', onload: (data) => { var blob = new Blob([data.response], { type: 'image/png' }); const fileReader = new FileReader() fileReader.onload = (e) => { res(e.target.result) } // readAsDataURL fileReader.readAsDataURL(blob) } }) } else { res(null) } })) const img_html = src ? `` : '' return `
${show_name}${img_html}
` } if (isBliLoading) return; isBliLoading = true; $(".cover2.easy-limestart .pContent").html(`
加载中...
`) GM_xmlhttpRequest({ url: "https://api.bilibili.com/x/web-interface/wbi/search/square?limit=15&platform=web", method: "get", onload: async (data) => { const { data: { trending: { list, title, top_list } }, code, message } = JSON.parse(data.response); // console.log(code, message) if (code != 0) { Message.info(message) } else { $(".cover2.easy-limestart .pCaptionBar").html(`刷新${title}`) // console.log(list, title, top_list) $("#btnRefreshBli").click(() => { requestBiApi() }) const rowList = [] for (const idx in list) { const { show_name, keyword, icon } = list[idx]; const row = await getRow(show_name, keyword, icon) rowList.push(row) } $(".cover2.easy-limestart .pContent .setGroup").html(rowList.join("")) isBliLoading = false; } }, onabort: () => { isBliLoading = false; }, onerror: () => { isBliLoading = false; } }) $(".cover2.easy-limestart").css({ display: "block", opacity: 1 }) $(".cover2.easy-limestart .popUp").css({ display: "block", opacity: 0, transform: 'rotate3d(1, 1, 0, 50deg)' }).offset(); $(".cover2.easy-limestart .popUp").css({ display: "block", opacity: 1, transform: 'none' }) } //B站热搜显示 function showBlibiliTrending(init = false) { // style="display: block; opacity: 1;" // style="display: block; opacity: 1; transform: none;" const dialog = `
` if (init) { GM_addStyle(`.cover2 { z-index: 100; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0,0,0,.35); display: none; opacity: 0; transition: .25s; perspective: 1000px; } .icon-bilibili { color: #00AFE0; } .bilibili-trending-img { height: 16px; margin-left: 5px; vertical-align: -2px; } #btnRefreshBli:hover { color: #fff; background-color: var(--err-color); }`) GM_addStyle(GM_getResourceText("css")) $(document.body).append(dialog); $(".cover2.easy-limestart .btnClose").hover(() => { $(".cover2.easy-limestart .popUp").css({ display: "block", opacity: 1, transform: 'rotate3d(1, 1, 0, 5deg)' }) }, () => { $(".cover2.easy-limestart .popUp").css({ display: "block", opacity: 1, transform: 'none' }) }) $(".cover2.easy-limestart .btnClose").click(() => { showBilibili = false; $(".cover2.easy-limestart").fadeOut(100) }) } else { showBilibili = !showBilibili; if (showBilibili) { requestBiApi() } else { $(".cover2.easy-limestart").fadeOut(100) } } } showBlibiliTrending(true); // 增加键盘事件 document.body.addEventListener("keydown", (e) => { if (e.altKey && e.key.toLowerCase() === 't') { showSearch = !showSearch; showSearchCb() Message.info(showSearch ? "显示搜索框" : '隐藏搜索框') ls.set("showSearch", showSearch) } if (e.altKey && e.key.toLowerCase() === 'g') { showTimer = !showTimer; showTimerCb() Message.info(showTimer ? "显示时间" : '隐藏时间') ls.set("showTimer", showTimer) } if (e.altKey && e.key.toLowerCase() === 'b') { showBlibiliTrending() } }); //自定义外部链接背景图 GM_addStyle(`.easy_input { width: calc(100% - 55px); color: var(--b-alpha-60); background-color: transparent; border: none; transition: .25s; } button#btnBrowse:disabled { background-color: gray!important; }`) const readUrlImg = (url) => { return new Promise((res) => { GM_xmlhttpRequest({ url, method: "get", responseType: 'blob', onload: async (data) => { var blob = new Blob([data.response], { type: 'image/png' }); const fileReader = new FileReader() fileReader.onload = (e) => { const img_url = URL.createObjectURL(blob) res([null, img_url, [data.response]]) } // readAsDataURL fileReader.readAsDataURL(blob) }, onerror: (err) => { if (err === 'permission not allowed') { Message.info('授权被拒绝') } else { Message.info(err) } res([err, null, null]) } }) }) } $("#contentBg .bgGroup").eq(0).after(`
`); $("#outsideImgUrlInput").on("input", async () => { const isChecked = $("#chkOutsideImgUrlBar").prop("checked") console.log(isChecked) if(!isChecked) return const key = `custom` const oldKey = 'oldCustom' const videoPosterKey = "customVideoPoster" $("#chkOutsideImgUrlBar").prop("checked", false); const pageFile = await indexedAction.get(storeName, oldKey); //老的视频或者图片 await indexedAction.put(pageFile, key) await indexedAction.delete(oldKey) if (!pageFile) { await indexedAction.delete(key) $("#bgPreBoxInnerCustom").addClass("unset").removeAttr("style"); // const gs = JSON.parse(localStorage.getItem("generalSettings") || {}); // gs['bgPreference'] = 'Default1' // localStorage.setItem("generalSettings", JSON.stringify(gs)) $("#bgPreBoxInnerDefault1").click(); ls.set("easy_custom_out_url_checked", false) return } const img_url = URL.createObjectURL(pageFile) if (pageFile.type.startsWith("video/")) { let videoPosterImg = await indexedAction.get(storeName, videoPosterKey); //是否能获取到视频封面 $("#liveBgBox").css({ display: 'block', opacity: 1, transform: "scale(1.1)" }).attr("src", img_url) $("#bgBox").css({ opacity: 0 }); if (videoPosterImg) { $("#bgPreBoxInnerCustom").css({ "background-image": `url(${videoPosterImg})` }) } } else { $("#liveBgBox").css({ display: 'none', opacity: 1, transform: 'scale(1.1)' }) $("#bgBox").css({ opacity: 1, transform: "scale(1.1)", display: "block" }); $("#bgPreBoxInnerCustom").css({ "background-image": `url(${img_url})` }) $("#bgBox").attr("src", img_url) } $("#bgPreBoxInnerCustom, #bgPreviewBoxCustom").off("click") $("#bgPreBoxInnerCustom, #bgPreviewBoxCustom").click(async () => { const pageFile = await indexedAction.get(storeName, key) const img_url = URL.createObjectURL(pageFile) if (pageFile.type.startsWith("video/")) { $("#liveBgBox").attr("src", img_url) } else { $("#bgBox").attr("src", img_url) } }) ls.set("easy_custom_out_url_checked", false) $("#btnBrowse").attr("disabled", false) }) // https://img0.baidu.com/it/u=68017732,1315184908&fm=253&fmt=auto&app=138&f=JPEG?w=642&h=243 $("#chkOutsideImgUrlBar").change(async (e) => { const { checked } = e.target const url = $("#outsideImgUrlInput").val() const key = `custom` const oldKey = 'oldCustom' const videoPosterKey = "customVideoPoster" if (checked && local_db && url) { const [error, img_url, bolb] = await readUrlImg($("#outsideImgUrlInput").val()); const file = new File(bolb, 'outside_url_img.png', { type: "image/png" }); //外部链接生成的图片 const oldFile = await indexedAction.get(storeName, key) //拿到当前正在使用的图片或者video await indexedAction.put(oldFile, oldKey) //拿到当前正在使用的图片或者video await indexedAction.put(file, key) //外部链接生成的图片 入住 custom //当前只支持图片,只要存储完成,如果以前用的是视频文件,那就需要隐藏,这里默认隐藏一次 $("#liveBgBox").css({ display: "none", opacity: 1, transform: 'scale(1.1)' }) $("#btnBrowse").attr("disabled", true) ls.set("easy_custom_out_url", url) $("#bgPreBoxInnerCustom").removeClass("unset").css({ "background-image": `url(${img_url})` }).click() $("#bgBox").attr("src", img_url) $("#bgPreBoxInnerCustom, #bgPreviewBoxCustom").off("click") $("#bgPreBoxInnerCustom, #bgPreviewBoxCustom").click(async () => { $("#bgBox").attr("src", img_url) }) } else { $("#btnBrowse").attr("disabled", false) if (!checked) { const pageFile = await indexedAction.get(storeName, oldKey); //老的视频或者图片 await indexedAction.put(pageFile, key) await indexedAction.delete(oldKey) if (!pageFile) { await indexedAction.delete(key) $("#bgPreBoxInnerCustom").addClass("unset").removeAttr("style"); // const gs = JSON.parse(localStorage.getItem("generalSettings") || {}); // gs['bgPreference'] = 'Default1' // localStorage.setItem("generalSettings", JSON.stringify(gs)) $("#bgPreBoxInnerDefault1").click(); ls.set("easy_custom_out_url_checked", false) return } const img_url = URL.createObjectURL(pageFile) if (pageFile.type.startsWith("video/")) { let videoPosterImg = await indexedAction.get(storeName, videoPosterKey); //是否能获取到视频封面 $("#liveBgBox").css({ display: 'block', opacity: 1, transform: "scale(1.1)" }).attr("src", img_url) $("#bgBox").css({ opacity: 0 }); if (videoPosterImg) { $("#bgPreBoxInnerCustom").css({ "background-image": `url(${videoPosterImg})` }) } } else { $("#liveBgBox").css({ display: 'none', opacity: 1, transform: 'scale(1.1)' }) $("#bgBox").css({ opacity: 1, transform: "scale(1.1)", display: "block" }); $("#bgPreBoxInnerCustom").css({ "background-image": `url(${img_url})` }) $("#bgBox").attr("src", img_url) } $("#bgPreBoxInnerCustom, #bgPreviewBoxCustom").off("click") $("#bgPreBoxInnerCustom, #bgPreviewBoxCustom").click(async () => { const pageFile = await indexedAction.get(storeName, key) const img_url = URL.createObjectURL(pageFile) if (pageFile.type.startsWith("video/")) { $("#liveBgBox").attr("src", img_url) } else { $("#bgBox").attr("src", img_url) } }) } else { if (!local_db) { Message.info('本地数据库查询失败') } if (!url) { Message.info('无效的链接') } } e.target.checked = false; } ls.set("easy_custom_out_url_checked", e.target.checked) }) function initCustomOutSideUrl() { const checked = ls.get("easy_custom_out_url_checked") const url = ls.get("easy_custom_out_url") if (checked) { $("#outsideImgUrlInput").val(url) $("#chkOutsideImgUrlBar").prop("checked", checked) } $("#btnBrowse").attr("disabled", checked) } initCustomOutSideUrl() console.log('start') })();