Bilibilii增强

增强哔哩哔哩的使用体验,笔记滚动条,未登录时去除登录弹窗,合集可拖拽

安裝腳本?
作者推薦腳本

您可能也會喜歡 哔哩哔哩屏蔽

安裝腳本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         Bilibilii增强
// @namespace    http://tampermonkey.net/
// @version      1.0.9
// @description  增强哔哩哔哩的使用体验,笔记滚动条,未登录时去除登录弹窗,合集可拖拽
// @author       xygod
// @match        *://www.bilibili.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=bilibili.com
// @grant        GM_addStyle
// @license      MIT
// @run-at       document-menu
// ==/UserScript==

(function () {
    'use strict';

    /**
     * @param {string} selector
     * @return {HTMLElement}
     * */
    function findDom(selector) {
        const startTime = new Date().getTime()
        return new Promise((resolve, reject) => {
            const id = setInterval(() => {
                const dom = document.querySelector(selector)
                if (dom) {
                    clearInterval(id)
                    resolve(dom)
                } else if (new Date().getTime() - startTime > 1000 * 30) {
                    clearInterval(id)
                    reject(`无法找到此dom元素: ${selector}`)
                }
            }, 200)
            }).catch(err=>console.trace(err))
    }

    /**
     * @param {string} selector
     * @return {HTMLElement[]}
     * */
    function findALLDom(selector) {
        const startTime = new Date().getTime()
        return new Promise((resolve, reject) => {
            const id = setInterval(() => {
                const doms = [...new Set(document.querySelectorAll(selector))]
                if (doms.length > 0) {
                    clearInterval(id)
                    resolve(doms)
                } else if (new Date().getTime() - startTime > 1000 * 30) {
                    clearInterval(id)
                    reject(`无法找到此dom元素: ${selector}`)
                }
            }, 200)
            }).catch(err=>console.trace(err))
    }

    function randomNum(start, end) {
        return Math.floor(Math.random() * (end - start + 1)) + start
    }


    function isNumber(v) {
        return typeof v === 'number' && isFinite(v);
    }

    showNoteScroll() //显示笔记的滚动条。
    openZimuMu() // 自动打开字幕。
    handleUnlogin() // 处理未登录状态下自动暂停视频弹出登录框的情况。
    handleSelectHeji() // 合集视频可以拖拽到新标签页
    // handleAddDanmu().then() // 自动添加在弹幕量少的视频里添加机器人弹幕好显的不那么冷清,现在有bug,暂不考虑完善,因为感觉也没必要有这个功能,不过既然写了那就保留这个代码吧。
    handleMinVideo() // 小窗的X按钮添加粉色背景,避免因白色视频帧导致的按钮不可见
    function showNoteScroll() {
        GM_addStyle(`
            .note-detail::-webkit-scrollbar {
                width: 18px !important;
            }
            .note-detail::-webkit-scrollbar-thumb {
                background: #d0cfcf !important;
            }
            .note-detail::-webkit-scrollbar-track {
                background: #5e5b5b !important;
            }
            .note-editor .editor-innter.ql-container .ql-editor::-webkit-scrollbar {
                width: 12px !important;
            }
            .resizable-component .ql-editor::-webkit-scrollbar-thumb {
                border-radius: 5px;
                background: #a9a9eb !important;
            }
            .note-list::-webkit-scrollbar {
                width: 12px !important;
            }
            .note-list::-webkit-scrollbar-thumb {
                background: #d8d0d0 !important;
            }
            .note-list::-webkit-scrollbar-track {
                background: #3d3c3cf2 !important;
            }
    `)
    }

    function openZimuMu() {
        const id = setInterval(() => {
            const zimuBtn = document.querySelector(".bpx-player-subtitle-panel-major-group")
            if (!zimuBtn) return
            const isOpenZiMu = zimuBtn.childNodes.length > 0
            if (isOpenZiMu) return
            document.querySelector(".bpx-player-ctrl-btn.bpx-player-ctrl-subtitle .bpx-common-svg-icon").click()
            clearInterval(id)
        }, 1000)
        }

    function handleUnlogin() {
        let mask = null
        let id = 0
        let showed = false
        run()

        function run() {
            if (showed) return
            mask = document.querySelector(".bili-mini-mask")
            if (mask) {
                const globalVideo = document.querySelector("video")
                mask.style.display = "none"
                mask.style.opacity = "0"
                globalVideo.play()
                document.querySelector(".bpx-player-ctrl-btn.bpx-player-ctrl-web").click()
                cancelAnimationFrame(id)
                mask.remove()
                showed = true
            }
            id = requestAnimationFrame(run)
        }
    }

    async function handleSelectHeji(){
        let doms = null
        let state = new URLSearchParams(location.href).keys().some(r=>r === "p") ? "xuanji" : "heji"
        if(state === "heji"){
            doms = await findALLDom(".pod-item.video-pod__item.simple")
        }else if (state === "xuanji"){
            doms = await findALLDom(".simple-base-item.video-pod__item.normal")
        }
        const items = [...new Set(doms)]
        items.forEach((r,i)=>{
            const a = document.createElement("a");
            a.addEventListener("click",function(e){
                e.preventDefault()
            })
            if(state === "heji"){
                a.href = `https://www.bilibili.com/video/${r.dataset.key}`
            }else if (state === "xuanji"){
                let params = []
                for(const param of new URLSearchParams(location.href)){
                    if(param[0]==="p"){
                        param[1] = i+1
                    }
                    params.push(param)
                }
                a.href = params.map(param=> param.join("=")).join("&")
            }
            a.innerHTML = r.innerHTML;
            a.className = r.className;
            r.parentNode.replaceChild(a, r);
        })
    }

   async function handleMinVideo(){
    GM_addStyle(`
    #bilibili-player > div > div > div.bpx-player-primary-area > div.bpx-player-video-area > div.bpx-player-mini-warp > div.bpx-player-mini-close{
    background-color: #ffc6c6
    }
    `)
   }


    async function handleAddDanmu() {
        let canAdd = true
        ;(await findDom("video")).addEventListener("change", async function () {
            console.log("change")
            canAdd = await canAddDanmu()
        })
        const needAdd = await canAddDanmu()
        if (!needAdd) {
            console.log("弹幕已经够多了,不需要添加弹幕了")
            return
        }
        // 如果大于10秒一个弹幕,说明太冷清了,要填充弹幕
        console.log("开始填充弹幕。。。")
        await autoAddDanmu()

        async function canAddDanmu() {
            const second = await calculateSecond()
            const danmuCount = await calculateDanmuCount()
            const weight = second / danmuCount // 几秒一个弹幕
            const isStudy = await isStudyingVideo()
            return weight > 5 && !isStudy // 如果小于5秒一个弹幕或者是学习视频,那就不要添加假弹幕了
        }

        async function autoAddDanmu() {
            /**
             * @type {HTMLVideoElement}
             * **/
            const mainVideo = await findDom("video")
            mainVideo.addEventListener("change", async function () {
                console.log("change")
                canAdd = await canAddDanmu()
            })
            const danmuWrap = await findDom(".bpx-player-row-dm-wrap")
            let t = ""
            setInterval(() => {
                if (!canAdd || mainVideo.paused) {
                    console.log("不可以填充弹幕")
                    return
                }
                console.log("可以填充弹幕")
                const text = getDanmuText()
                t = text
                console.log(t.length * 0.3)
                const danmuDom = createDanmaku(text)
                danmuWrap.appendChild(danmuDom)
            }, (6 + t.length * 0.4) * 1000)

            function createDanmaku(text, option = {
                type: "roll", opacity: 1, fontSize: 25, color: "#ffffff",
            }) {
                // 创建主要的div元素
                const div = document.createElement('div');
                div.setAttribute('aria-live', 'polite');
                div.setAttribute('role', 'comment');
                div.className = `bili-danmaku-x-dm bili-danmaku-x-${option.type} bili-danmaku-x-high-top bili-danmaku-x-show`;
                div.style.cssText = `--opacity: ${option.opacity}; --fontSize: ${option.fontSize}px; --fontFamily: SimHei, "Microsoft JhengHei", Arial, Helvetica, sans-serif; --fontWeight: normal; --color: ${option.color}; --textShadow: 1px 0 1px #000000,0 1px 1px #000000,0 -1px 1px #000000,-1px 0 1px #000000; --top: 4px;`;
                // 基本偏移量,屏幕宽度相关
                const baseOffset = 830; // 基础偏移量,可以根据实际屏幕宽度调整
                // 根据内容长度计算translateX和duration
                const textLength = text.length
                const maxDuration = 12; // 最大持续时间(秒)
                const translateX = -1 * (textLength * 25 + baseOffset);
                const duration = Math.min(maxDuration, 2 + textLength * 0.4);
                // 设置弹幕的 CSS 属性
                div.style.setProperty('--offset', `${baseOffset}px`);
                div.style.setProperty('--translateX', `${translateX}px`);
                div.style.setProperty('--duration', `${duration}s`);

                // 创建图标span
                const iconSpan = document.createElement('span');
                iconSpan.className = 'bili-danmaku-x-high-icon';
                iconSpan.style.cssText = 'width:25px;height:25px;';

                // 创建+1 em元素
                const plusEm = document.createElement('em');
                plusEm.className = 'bili-danmaku-x-high-plus';
                plusEm.style.fontSize = '12.5px';
                plusEm.textContent = '+1';

                // 创建动画span
                const animateSpan = document.createElement('span');
                animateSpan.className = 'bili-danmaku-x-high-icon-animate';

                // 创建文本span
                const textSpan = document.createElement('span');
                textSpan.className = 'bili-danmaku-x-high-text';
                textSpan.textContent = text;

                // 组装DOM结构
                const showIcon = Math.random() > 0.7
                showIcon ? iconSpan.appendChild(plusEm) : void 0;
                showIcon ? iconSpan.appendChild(animateSpan) : void 0;
                showIcon ? div.appendChild(iconSpan) : void 0;
                div.appendChild(textSpan);
                const id = setInterval(() => {
                    if (mainVideo.paused) return
                    const style = window.getComputedStyle(div);
                    const transform = style.transform;
                    // 提取 matrix 的 translateX 值
                    const matrixValues = transform.match(/matrix\(([^)]+)\)/);
                    console.log(matrixValues)
                    if (matrixValues) {
                        const matrix = matrixValues[1].split(', ');
                        console.log(div)
                        console.log("parseFloat(matrix[4])", parseFloat(matrix[4]))
                        console.log("translateX", translateX)
                        if (parseFloat(matrix[4]) <= translateX) {
                            clearInterval(id)
                            console.log("删除")
                            div.remove()
                        }
                    }

                }, duration * 1000)

                return div;
            }

            const words = ["人生不止眼前的苟且,还有诗和远方", "不要等待机会,而要创造机会", "成功不是将来才有的,而是从决定去做的那一刻起,持续累积而成", "当你感到痛苦时,就是你成长的时候", "没有人可以回到过去重新开始,但谁都可以从现在开始,书写一个全然不同的结局", "生命中最困难的时刻,不是没有人懂你,而是你不懂你自己", "不要轻易放弃,学会等待,因为你坚持多一秒,就可能会发生奇迹", "成功的秘诀是坚持目标不动摇", "没有退路的时候,正是潜力发挥最大的时候", "相信自己,你比想象中更强大", "每一个不曾起舞的日子,都是对生命的辜负", "当你的才华还撑不起你的野心时,你就应该静下心来学习", "不要让未来的你,讨厌现在的自己", "成功不是终点,失败也不是终结,最重要的是继续前进的勇气", "人生就像一杯茶,不会苦一辈子,但总会苦一阵子", "没有人陪你走一辈子,所以你要学会独立", "不要等待,时机永远不会恰到好处。行动吧,从现在开始", "生活不是等待暴风雨过去,而是学会在雨中跳舞", "成功的道路上并不拥挤,因为坚持的人不多", "当你觉得自己又丑又穷,一无是处时,别绝望,因为至少你的判断还是对的", "你要做自己的太阳,不断地温暖自己", "不要因为走得太远,忘了当初为什么出发", "生活中没有白走的路,每一步都算数", "你的选择是做或不做,但不做就永远不会有机会", "不要总是等待别人来安慰你,要学会自己治愈自己", "人生就像骑自行车。想保持平衡就得往前走", "没有人能够回到过去重新开始,但谁都可以从现在开始,书写一个全新的结局", "不要为已消逝之年华叹息,须正视欲匆匆溜走的时光", "当你改变不了环境时,就改变自己", "不要等待完美时机,因为它永远不会来临", "成功的关键在于相信自己有成功的能力", "不要因为别人的否定而放弃自己的梦想", "人生最大的挑战是超越自己", "每一个成功者都有一个开始。勇于开始,才能找到成功的路", "不要被昨天的失败打倒,要吸取教训,面向明天", "当你感到疲惫的时候,就是你即将突破的时候", "成功不是偶然的,而是日复一日累积的结果", "不要害怕失败,因为那只是成功之路上的一个踏脚石", "生命不在于活得长,而在于活得精彩", "不要总是羡慕别人的生活,努力活出自己的精彩", "成功的秘诀是坚持一个主要目标不动摇", "不要被现实束缚住想象力", "人生就是一场修行,修的是心智,历的是岁月", "不要等待机会,而要创造机会", "成功的道路上并不拥挤,因为坚持的人不多", "不要因为走得太远,而忘记了为什么出发", "生活中没有白走的路,每一步都算数", "你的选择是做或不做,但不做就永远不会有机会", "不要总是等待别人来安慰你,要学会自己治愈自己", "人生就像骑自行车。想保持平衡就得往前走", "没有人能够回到过去重新开始,但谁都可以从现在开始,书写一个全新的结局", "不要为已消逝之年华叹息,须正视欲匆匆溜走的时光", "当你改变不了环境时,就改变自己", "不要等待完美时机,因为它永远不会来临", "成功的关键在于相信自己有成功的能力", "不要因为别人的否定而放弃自己的梦想", "人生最大的挑战是超越自己", "每一个成功者都有一个开始。勇于开始,才能找到成功的路", "不要被昨天的失败打倒,要吸取教训,面向明天", "当你感到疲惫的时候,就是你即将突破的时候", "成功不是偶然的,而是日复一日累积的结果", "不要害怕失败,因为那只是成功之路上的一个踏脚石", "生命不在于活得长,而在于活得精彩", "不要总是羡慕别人的生活,努力活出自己的精彩", "成功的秘诀是坚持一个主要目标不动摇", "不要被现实束缚住想象力", "人生就是一场修行,修的是心智,历的是岁月", "不要等待机会,而要创造机会", "成功的道路上并不拥挤,因为坚持的人不多", "不要因为走得太远,而忘记了为什么出发", "生活中没有白走的路,每一步都算数", "你的选择是做或不做,但不做就永远不会有机会", "不要总是等待别人来安慰你,要学会自己治愈自己", "人生就像骑自行车。想保持平衡就得往前走", "没有人能够回到过去重新开始,但谁都可以从现在开始,书写一个全新的结局", "不要为已消逝之年华叹息,须正视欲匆匆溜走的时光", "当你改变不了环境时,就改变自己", "不要等待完美时机,因为它永远不会来临", "成功的关键在于相信自己有成功的能力", "不要因为别人的否定而放弃自己的梦想", "人生最大的挑战是超越自己", "每一个成功者都有一个开始。勇于开始,才能找到成功的路", "不要被昨天的失败打倒,要吸取教训,面向明天", "当你感到疲惫的时候,就是你即将突破的时候", "成功不是偶然的,而是日复一日累积的结果", "不要害怕失败,因为那只是成功之路上的一个踏脚石", "生命不在于活得长,而在于活得精彩", "不要总是羡慕别人的生活,努力活出自己的精彩", "成功的秘诀是坚持一个主要目标不动摇", "不要被现实束缚住想象力", "人生就是一场修行,修的是心智,历的是岁月", "不要等待机会,而要创造机会", "成功的道路上并不拥挤,因为坚持的人不多", "不要因为走得太远,而忘记了为什么出发", "生活中没有白走的路,每一步都算数", "你的选择是做或不做,但不做就永远不会有机会", "不要总是等待别人来安慰你,要学会自己治愈自己", "人生就像骑自行车。想保持平衡就得往前走", "没有人能够回到过去重新开始,但谁都可以从现在开始,书写一个全新的结局", "不要为已消逝之年华叹息,须正视欲匆匆溜走的时光", "当你改变不了环境时,就改变自己", "不要等待完美时机,因为它永远不会来临", "成功的关键在于相信自己有成功的能力", "不要因为别人的否定而放弃自己的梦想", "人生最大的挑战是超越自己", "每一个成功者都有一个开始。勇于开始,才能找到成功的路", "不要被昨天的失败打倒,要吸取教训,面向明天", "当你感到疲惫的时候,就是你即将突破的时候", "成功不是偶然的,而是日复一日累积的结果", "不要害怕失败,因为那只是成功之路上的一个踏脚石", "生命不在于活得长,而在于活得精彩", "不要总是羡慕别人的生活,努力活出自己的精彩", "成功的秘诀是坚持一个主要目标不动摇", "不要被现实束缚住想象力", "人生就是一场修行,修的是心智,历的是岁月", "不要等待机会,而要创造机会", "成功的道路上并不拥挤,因为坚持的人不多", "不要因为走得太远,而忘记了为什么出发", "生活中没有白走的路,每一步都算数", "你的选择是做或不做,但不做就永远不会有机会", "不要总是等待别人来安慰你,要学会自己治愈自己", "人生就像骑自行车。想保持平衡就得往前走", "没有人能够回到过去重新开始,但谁都可以从现在开始,书写一个全新的结局", "不要为已消逝之年华叹息,须正视欲匆匆溜走的时光", "当你改变不了环境时,就改变自己", "不要等待完美时机,因为它永远不会来临", "成功的关键在于相信自己有成功的能力", "不要因为别人的否定而放弃自己的梦想", "人生最大的挑战是超越自己", "每一个成功者都有一个开始。勇于开始,才能找到成功的路", "不要被昨天的失败打倒,要吸取教训,面向明天", "当你感到疲惫的时候,就是你即将突破的时候", "成功不是偶然的,而是日复一日累积的结果", "不要害怕失败,因为那只是成功之路上的一个踏脚石", "生命不在于活得长,而在于活得精彩", "不要总是羡慕别人的生活,努力活出自己的精彩", "成功的秘诀是坚持一个主要目标不动摇", "不要被现实束缚住想象力", "人生就是一场修行,修的是心智,历的是岁月", "不要等待机会,而要创造机会", "成功的道路上并不拥挤,因为坚持的人不多", "不要因为走得太远,而忘记了为什么出发", "生活中没有白走的路,每一步都算数", "你的选择是做或不做,但不做就永远不会有机会", "不要总是等待别人来安慰你,要学会自己治愈自己", "人生就像骑自行车。想保持平衡就得往前走", "没有人能够回到过去重新开始,但谁都可以从现在开始,书写一个全新的结局", "不要为已消逝之年华叹息,须正视欲匆匆溜走的时光", "当你改变不了环境时,就改变自己", "不要等待完美时机,因为它永远不会来临", "成功的关键在于相信自己有成功的能力", "不要因为别人的否定而放弃自己的梦想", "人生最大的挑战是超越自己", "每一个成功者都有一个开始。勇于开始,才能找到成功的路", "不要被昨天的失败打倒,要吸取教训,面向明天", "当你感到疲惫的时候,就是你即将突破的时候", "成功不是偶然的,而是日复一日累积的结果", "不要害怕失败,因为那只是成功之路上的一个踏脚石", "生命不在于活得长,而在于活得精彩", "不要总是羡慕别人的生活,努力活出自己的精彩", "成功的秘诀是坚持一个主要目标不动摇", "不要被现实束缚住想象力", "人生就是一场修行,修的是心智,历的是岁月", "不要等待机会,而要创造机会", "成功的道路上并不拥挤,因为坚持的人不多", "不要因为走得太远,而忘记了为什么出发", "生活中没有白走的路,每一步都算数", "你的选择是做或不做,但不做就永远不会有机会", "不要总是等待别人来安慰你,要学会自己治愈自己", "人生就像骑自行车。想保持平衡就得往前走", "没有人能够回到过去重新开始,但谁都可以从现在开始,书写一个全新的结局", "不要为已消逝之年华叹息,须正视欲匆匆溜走的时光", "当你改变不了环境时,就改变自己", "不要等待完美时机,因为它永远不会来临", "成功的关键在于相信自己有成功的能力", "不要因为别人的否定而放弃自己的梦想", "人生最大的挑战是超越自己", "每一个成功者都有一个开始。勇于开始,才能找到成功的路", "不要被昨天的失败打倒,要吸取教训,面向明天", "当你感到疲惫的时候,就是你即将突破的时候", "成功不是偶然的,而是日复一日累积的结果", "不要害怕失败,因为那只是成功之路上的一个踏脚石", "生命不在于活得长,而在于活得精彩", "不要总是羡慕别人的生活,努力活出自己的精彩", "成功的秘诀是坚持一个主要目标不动摇", "不要被现实束缚住想象力", "人生就是一场修行,修的是心智,历的是岁月", "不要等待机会,而要创造机会", "成功的道路上并不拥挤,因为坚持的人不多", "不要因为走得太远,而忘记了为什么出发", "生活中没有白走的路,每一步都算数", "你的选择是做或不做,但不做就永远不会有机会", "不要总是等待别人来安慰你,要学会自己治愈自己", "人生就像骑自行车。想保持平衡就得往前走", "没有人能够回到过去重新开始,但谁都可以从现在开始,书写一个全新的结局", "不要为已消逝之年华叹息,须正视欲匆匆溜走的时光", "当你改变不了环境时,就改变自己", "不要等待完美时机,因为它永远不会来临", "成功的关键在于相信自己有成功的能力", "不要因为别人的否定而放弃自己的梦想", "人生最大的挑战是超越自己", "每一个成功者都有一个开始。勇于开始,才能找到成功的路", "不要被昨天的失败打倒,要吸取教训,面向明天", "当你感到疲惫的时候,就是你即将突破的时候", "成功不是偶然的,而是日复一日累积的结果", "不要害怕失败,因为那只是成功之路上的一个踏脚石", "生命不在于活得长,而在于活得精彩", "不要总是羡慕别人的生活,努力活出自己的精彩", "成功的秘诀是坚持一个主要目标不动摇", "不要被现实束缚住想象力", "人生就是一场修行,修的是心智,历的是岁月", "不要等待机会,而要创造机会", "成功的道路上并不拥挤,因为坚持的人不多", "不要因为走得太远,而忘记了为什么出发", "生活中没有白走的路,每一步都算数", "你的选择是做或不做,但不做就永远不会有机会", "不要总是等待别人来安慰你,要学会自己治愈自己", "人生就像骑自行车。想保持平衡就得往前走", "没有人能够回到过去重新开始,但谁都可以从现在开始,书写一个全新的结局", "不要为已消逝之年华叹息,须正视欲匆匆溜走的时光", "当你改变不了环境时,就改变自己", "不要等待完美时机,因为它永远不会来临", "成功的关键在于相信自己有成功的能力", "不要因为别人的否定而放弃自己的梦想", "人生最大的挑战是超越自己", "每一个成功者都有一个开始。勇于开始,才能找到成功的路", "不要被昨天的失败打倒,要吸取教训,面向明天", "当你感到疲惫的时候,就是你即将突破的时候", "成功不是偶然的,而是日复一日累积的结果", "不要害怕失败,因为那只是成功之路上的一个踏脚石", "生命不在于活得长,而在于活得精彩", "不要总是羡慕别人的生活,努力活出自己的精彩", "成功的秘诀是坚持一个主要目标不动摇", "不要被现实束缚住想象力", "人生就是一场修行,修的是心智,历的是岁月", "不要等待机会,而要创造机会", "成功的道路上并不拥挤,因为坚持的人不多", "不要因为走得太远,而忘记了为什么出发", "生活中没有白走的路,每一步都算数", "你的选择是做或不做,但不做就永远不会有机会", "不要总是等待别人来安慰你,要学会自己治愈自己", "人生就像骑自行车。想保持平衡就得往前走", "没有人能够回到过去重新开始,但谁都可以从现在开始,书写一个全新的结局", "不要为已消逝之年华叹息,须正视欲匆匆溜走的时光", "当你改变不了环境时,就改变自己", "不要等待完美时机,因为它永远不会来临", "成功的关键在于相信自己有成功的能力", "不要因为别人的否定而放弃自己的梦想", "人生最大的挑战是超越自己", "每一个成功者都有一个开始。勇于开始,才能找到成功的路", "不要被昨天的失败打倒,要吸取教训,面向明天", "当你感到疲惫的时候,就是你即将突破的时候", "成功不是偶然的,而是日复一日累积的结果", "不要害怕失败,因为那只是成功之路上的一个踏脚石", "生命不在于活得长,而在于活得精彩", "不要总是羡慕别人的生活,努力活出自己的精彩", "成功的秘诀是坚持一个主要目标不动摇", "不要被现实束缚住想象力", "人生就是一场修行,修的是心智,历的是岁月", "不要等待机会,而要创造机会", "成功的道路上并不拥挤,因为坚持的人不多", "不要因为走得太远,而忘记了为什么出发", "生活中没有白走的路,每一步都算数", "你的选择是做或不做,但不做就永远不会有机会", "不要总是等待别人来安慰你,要学会自己治愈自己", "人生就像骑自行车。想保持平衡就得往前走", "没有人能够回到过去重新开始,但谁都可以从现在开始,书写一个全新的结局", "不要为已消逝之年华叹息,须正视欲匆匆溜走的时光", "当你改变不了环境时,就改变自己", "不要等待完美时机,因为它永远不会来临", "成功的关键在于相信自己有成功的能力", "不要因为别人的否定而放弃自己的梦想", "人生最大的挑战是超越自己", "每一个成功者都有一个开始。勇于开始,才能找到成功的路", "不要被昨天的失败打倒,要吸取教训,面向明天", "当你感到疲惫的时候,就是你即将突破的时候", "成功不是偶然的,而是日复一日累积的结果", "不要害怕失败,因为那只是成功之路上的一个踏脚石", "生命不在于活得长,而在于活得精彩", "不要总是羡慕别人的生活,努力活出自己的精彩", "成功的秘诀是坚持一个主要目标不动摇", "不要被现实束缚住想象力", "人生就是一场修行,修的是心智,历的是岁月", "不要等待机会,而要创造机会", "成功的道路上并不拥挤,因为坚持的人不多", "不要因为走得太远,而忘记了为什么出发", "生活中没有白走的路,每一步都算数", "你的选择是做或不做,但不做就永远不会有机会", "不要总是等待别人来安慰你,要学会自己治愈自己", "人生就像骑自行车。想保持平衡就得往前走", "没有人能够回到过去重新开始,但谁都可以从现在开始,书写一个全新的结局", "不要为已消逝之年华叹息,须正视欲匆匆溜走的时光", "当你改变不了环境时,就改变自己", "不要等待完美时机,因为它永远不会来临", "成功的关键在于相信自己有成功的能力", "不要因为别人的否定而放弃自己的梦想", "人生最大的挑战是超越自己", "每一个成功者都有一个开始。勇于开始,才能找到成功的路", "不要被昨天的失败打倒,要吸取教训,面向明天", "当你感到疲惫的时候,就是你即将突破的时候", "成功不是偶然的,而是日复一日累积的结果", "不要害怕失败,因为那只是成功之路上的一个踏脚石", "生命不在于活得长,而在于活得精彩", "不要总是羡慕别人的生活,努力活出自己的精彩", "成功的秘诀是坚持一个主要目标不动摇", "不要被现实束缚住想象力", "人生就是一场修行,修的是心智,历的是岁月", "不要等待机会,而要创造机会", "成功的道路上并不拥挤,因为坚持的人不多", "不要因为走得太远,而忘记了为什么出发", "生活中没有白走的路,每一步都算数", "你的选择是做或不做,但不做就永远不会有机会", "不要总是等待别人来安慰你,要学会自己治愈自己", "人生就像骑自行车。想保持平衡就得往前走", "没有人能够回到过去重新开始,但谁都可以从现在开始,书写一个全新的结局", "不要为已消逝之年华叹息,须正视欲匆匆溜走的时光", "当你改变不了环境时,就改变自己", "不要等待完美时机,因为它永远不会来临", "成功的关键在于相信自己有成功的能力", "不要因为别人的否定而放弃自己的梦想", "人生最大的挑战是超越自己"]

            function getDanmuText() {
                return words[randomNum(0, words.length - 1)]
            }
        }

        async function calculateSecond() {
            const timeStr = (await findDom(".bpx-player-ctrl-time-duration")).textContent
            return timeStr.split(":").reduce((acc, currentValue, currentIndex, array) => acc + Math.pow(60, (array.length - 1 - currentIndex)) * +currentValue, 0)
        }

        async function calculateDanmuCount() {
            const name2Count = {"万": 10000, "百万": 1000000, "亿": 100000000}
            const danmuStr = (await findDom(".dm-text")).textContent
            const danmuCount = isNumber(+danmuStr) ? +danmuStr : +danmuStr.slice(0, -1) * name2Count[danmuStr.slice(-1)]
            return danmuCount
        }

        async function isStudyingVideo() {
            const studyTags = [// Academic subjects
                "学习", "教育", "考试", "高考", "中考", "考研", "四六级", "数学", "语文", "英语", "物理", "化学", "生物", "历史", "地理", "政治", "高数", "线代", "概率论", "统计学",

                // Professional skills
                "编程", "计算机", "IT", "软件开发", "前端", "后端", "人工智能", "设计", "建筑", "医学", "金融", "经济", "会计", "法律",

                // Knowledge sharing
                "知识分享", "经验分享", "干货", "教程", "讲座", "公开课", "学习方法", "考试技巧", "职业规划", "求职", "考证",

                // Skills development
                "技能培训", "职业技能", "自我提升", "能力培养", "实用技巧", "专业课", "考试辅导", "学习笔记",

                // Academic levels
                "大学课程", "研究生", "博士", "硕士", "本科", "高中", "初中", "小学", "幼教"];
            const tags = await findALLDom(".tag-link")
            return tags.some(r => studyTags.includes(r.textContent))
        }
    }

})();