Greasy Fork

Greasy Fork is available in English.

简单的青柠起始页优化

默认去掉青柠起始页的页脚,使用 alt + t 控制搜索框的显示隐藏 使用alt + g切换时钟显示隐藏,变量全局存储,不需要每次打开都关闭或者显示了 alt+b 显示隐藏 B站热搜

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==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')
})();