简单的青柠起始页优化
// ==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 ? `<img class="bilibili-trending-img" src="${src}" />` : ''
return `<div class="setOptBox">
<span class="setOptCaption" style="margin-left: -6px;">
<a href="https://search.bilibili.com/all?keyword=${keyword}" class="link" target="_blank"><i class="icon iconfont icon-bilibili" style="padding-right: 5px;"></i>${show_name}${img_html}</a>
</span>
</div>`
}
if (isBliLoading) return;
isBliLoading = true;
$(".cover2.easy-limestart .pContent").html(`<div class="setGroup">
<div class="setOptBox">
<span class="setOptCaption" style="margin-left: -6px;">
<a href="javascript:void(0)" class="link" target="_blank">加载中...</a>
</span>
</div>
</div>`)
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(`<span class="btnRectangle3" style="left: 5px; right: auto; top: 6px;" id="btnRefreshBli" role="button" tabindex="0">刷新</span>${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 = `<div class="cover2 easy-limestart">
<div class="popUp" id="bilibiliTrending" style="display: block; opacity: 1; transform: none;">
<span class="btnClose" role="button" tabindex="0" title="关闭"><span class="btnCloseInner"></span></span>
<div class="pCaptionBar scrolled"></div>
<div class="pContent" id="contentGSet">
<div class="setGroup">
<div class="setOptBox">
<span class="setOptCaption" style="margin-left: -6px;">
<a href="javascript:void(0)" class="link" target="_blank">加载中...</a>
</span>
</div>
</div>
</div>
</div>
</div>`
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(`
<div style="position: relative; height:26px; align-items:end;" class='bgGroup'>
<input id="outsideImgUrlInput" placeholder="请输入外部图片链接" class="easy_input" />
<label class="switch">
<input type="checkbox" id="chkOutsideImgUrlBar">
<div class="slider" id="chkOutsideImgUrlBarInner"></div>
</label>
</div>
`);
$("#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')
})();