Greasy Fork 支持简体中文。

bilibili外挂字幕

按Q键+100ms,按W键-100ms

目前為 2020-03-09 提交的版本,檢視 最新版本

// ==UserScript==
// @name         bilibili外挂字幕
// @namespace    http://tampermonkey.net/
// @version      0.14
// @description  按Q键+100ms,按W键-100ms
TODO
做得好看一点
整合爱奇艺的
时间轴消息
直接搜索字幕
// @author       cyj98
// @match        https://www.bilibili.com/bangumi/*
// @grant        none
// @require https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js
// @require https://greasyfork.org/scripts/373379-subtitle-utils-module/code/subtitle%20utils%20module.js?version=637875
// ==/UserScript==
(function () {
    'use strict';
    // var $ = window.jQuery;
    $("body").prepend('<button id="open-file">字幕</button>')
    $("#open-file").click(function () {

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


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

            var file = e.target.files[0];
            if (!file) {
                return;
            }
            var reader = new FileReader();
            reader.onload = function (e) {
                var delayTime = 0
                $(window).on('keypress', function (e) {
                    var code = (e.keyCode ? e.keyCode : e.which);
                    if (code === 113) {
                        delayTime += 100
                    } else if (code === 119) {
                        delayTime -= 100
                    }
                    console.log(code, "delayTime", delayTime)
                });
                window.currentTime = 0

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

                var targetNode = document.getElementsByClassName('bilibili-player-video-time-now')[0]

                var config = {
                    attributes: true,
                    childList: true,
                    subtree: true
                };

                var callback = function (mutationsList, observer) {
                    // console.log("observer.subtitles", observer.subtitles)
                    let strTime = targetNode.innerHTML
                    if (strTime.length <= 5) {
                        strTime = "00:" + strTime + ",000"
                    } else {
                        strTime = strTime + ",000"
                    }
                    // console.log("srtTime", strTime)
                    let time = window.Subtitle.toMS(strTime);
                    if (time + delayTime == window.currentTime) {
                        return;
                    }
                    window.currentTime = time
                    // console.log("time:", time);


                    let custom_subtitle = document.getElementById('custom-subtitle');
                    let binarySearch = function (target, arr) {
                        var start = 0;
                        var end = arr.length - 1;

                        while (start <= end) {
                            var 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 subtitles = observer.subtitles;
                    var pos = binarySearch(time + delayTime, subtitles)
                    if (pos == -1) return;
                    console.log(subtitles[pos].text);
                    custom_subtitle.innerHTML = subtitles[pos].text;
                    window.subtitleCount += 1
                };

                var 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)
        var eventMouse = document.createEvent("MouseEvents")
        eventMouse.initMouseEvent("click", true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null)
        fileInput.dispatchEvent(eventMouse)
    })


})();