// ==UserScript==
// @name bilibili外挂字幕 哔哩哔哩外挂字幕
// @namespace http://tampermonkey.net/
// @version 0.12
// @description 哔哩哔哩外挂字幕
// @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").prepend('
')
$(".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_1 = document.getElementById('custom-subtitle-1');
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_1.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)
})
})();