// ==UserScript== // @name bilibili外挂字幕 // @namespace http://tampermonkey.net/ // @version 0.13 // @description 按Q键+100ms,按W键-100ms // @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 // @downloadURL none // ==/UserScript== (function () { 'use strict'; // var $ = window.jQuery; $("body").prepend('') $("#open-file").click(function () { // .bilibili-player-video-subtitle $(".subtitle-position").prepend('

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