feat: support subtitle translate for userscript

This commit is contained in:
Gabe
2025-10-15 21:41:09 +08:00
parent 5e67e15842
commit ecab4ab634
9 changed files with 89 additions and 70 deletions

View File

@@ -0,0 +1,19 @@
export const XMLHttpRequestInjector = () => {
const originalOpen = XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open = function (...args) {
const url = args[1];
if (typeof url === "string" && url.includes("timedtext")) {
this.addEventListener("load", function () {
window.postMessage(
{
type: "KISS_XHR_DATA_YOUTUBE",
url: this.responseURL,
response: this.responseText,
},
window.location.origin
);
});
}
return originalOpen.apply(this, args);
};
};

View File

@@ -38,7 +38,6 @@ class YouTubeCaptionProvider {
initialize() {
window.addEventListener("message", (event) => {
if (event.source !== window) return;
if (event.data?.type === MSG_XHR_DATA_YOUTUBE) {
const { url, response } = event.data;
if (url && response) {

View File

@@ -5,6 +5,8 @@ import { DEFAULT_API_SETTING } from "../config/api.js";
import { DEFAULT_SUBTITLE_SETTING } from "../config/setting.js";
import { injectExternalJs } from "../libs/injector.js";
import { logger } from "../libs/log.js";
import { XMLHttpRequestInjector } from "./XMLHttpRequestInjector.js";
import { injectInlineJs } from "../libs/injector.js";
const providers = [
{ pattern: "https://www.youtube.com", start: YouTubeInitializer },
@@ -19,18 +21,10 @@ export function runSubtitle({ href, setting, isUserscript }) {
const provider = providers.find((item) => isMatch(href, item.pattern));
if (provider) {
const id = "kiss-translator-xmlHttp-injector";
if (isUserscript) {
GM.addElement("script", {
src: "https://github.com/fishjar/kiss-translator/blob/gh-pages/injector.js",
// src: "http://127.0.0.1:8000/injector.js",
type: "text/javascript",
}).onload = function () {
console.log(
"Script successfully injected and loaded via GM_addElement."
);
};
injectInlineJs(`(${XMLHttpRequestInjector})()`, id);
} else {
const id = "kiss-translator-injector";
const src = browser.runtime.getURL("injector.js");
injectExternalJs(src, id);
}