bilibili外挂字幕

按Q键+100ms,按W键-100ms,按E键显示/隐藏字幕

当前为 2020-03-09 提交的版本,查看 最新版本

// ==UserScript==
// @name         bilibili外挂字幕
// @namespace    https://truework.top
// @version      0.20
// @description  按Q键+100ms,按W键-100ms,按E键显示/隐藏字幕
// @author       cyj98
// @match        https://www.bilibili.com/bangumi/*
// @match        https://www.iqiyi.com/*
// @grant        none
// @require https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js
// @require https://gf.qytechs.cn/scripts/373379-subtitle-utils-module/code/subtitle%20utils%20module.js?version=637875
// ==/UserScript==


(function () {
    'use strict';
    $("body").prepend('<button id="open-file">字幕</button>')
    $("#open-file").click(() => {

        // .bilibili-player-video-subtitle
        $(".subtitle-position").prepend('<div id="custom-subtitle" style="text-align:center; font-size: 32px; font-weight: bold; text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;"></div>')

        let fileInput = document.createElement("input")
        fileInput.type = 'file'
        fileInput.style.display = 'none'
        fileInput.onchange = (e) => {

            let file = e.target.files[0];
            if (!file) {
                return;
            }
            let reader = new FileReader();
            let isShow = true
            reader.onload = (e) => {
                let delayTime = 0
                $(window).on('keypress', (e) => {
                    let code = (e.keyCode ? e.keyCode : e.which);
                    if (code === 113) {
                        delayTime += 100
                        console.log("delayTime: ", delayTime)
                    } else if (code === 119) {
                        delayTime -= 100
                        console.log("delayTime: ", delayTime)
                    }
                    else if (code === 101) {
                        if (isShow) {
                            $('#custom-subtitle').css({ "display": "none" })
                            console.log("hide subtitle")
                        } else {
                            $('#custom-subtitle').css({ "display": "block" })
                            console.log("show subtitle")
                        }
                        isShow = !isShow
                    }
                });

                let contents = e.target.result;
                document.body.removeChild(fileInput)
                // console.log(contents)

                let targetNode = document.getElementsByClassName('bilibili-player-video-time-now')[0]
                let config = {
                    attributes: true,
                    childList: true,
                    subtree: true
                };

                let prevPos = -2

                let binarySearch = (target, arr) => {
                    let start = 0;
                    let end = arr.length - 1;

                    while (start <= end) {
                        let mid = parseInt(start + (end - start) / 2);
                        if (target >= arr[mid].start && target <= arr[mid].end) {
                            return mid;
                        } else if (target > arr[mid].end) {
                            start = mid + 1;
                        } else {
                            end = mid - 1;
                        }
                    }
                    return -1;
                }

                let callback = (_, observer) => {
                    // console.log("observer.subtitles", observer.subtitles)
                    let strTime = targetNode.innerHTML
                    if (strTime.length <= 5) {
                        strTime = "00:" + strTime + ",000"
                    } else {
                        strTime = strTime + ",000"
                    }
                    let time = window.Subtitle.toMS(strTime);

                    let subtitles = observer.subtitles;
                    let pos = binarySearch(time + delayTime, subtitles)
                    if (pos === -1) {
                        $('#custom-subtitle').css({ "display": "none" })
                        return;
                    }
                    if (pos === prevPos) {
                        prevPos = pos
                        return
                    }
                    console.log(subtitles[pos].text);
                    if (isShow === true) {
                        $('#custom-subtitle').css({ "display": "block" })
                    }
                    $('#custom-subtitle').html(subtitles[pos].text)
                    window.subtitleCount += 1
                    prevPos = pos
                };

                let observer = new MutationObserver(callback);
                // 将字幕转换为对象数组
                try {
                    observer.subtitles = window.Subtitle.parse(contents)
                } catch (e) {
                    alert("字幕解析出现问题");
                }
                observer.observe(targetNode, config);
            }
            reader.readAsText(file)
        }

        document.body.appendChild(fileInput)
        let eventMouse = document.createEvent("MouseEvents")
        eventMouse.initMouseEvent("click", true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null)
        fileInput.dispatchEvent(eventMouse)
    })
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址