refactor: xrh

This commit is contained in:
mrbunker
2023-07-29 15:14:37 +08:00
parent 001b22f9e6
commit f1fc11c81d
9 changed files with 95 additions and 154 deletions

View File

@@ -9,3 +9,4 @@ pnpm dev
pnpm build
pnpm preview
```

View File

@@ -1,4 +1,4 @@
import xhr from "@/utils/xhr";
import { handleFetch } from "@/utils/xhr";
import { SiteItem } from "@/utils/siteList";
import { memo, useEffect, useState } from "preact/compat";
@@ -23,7 +23,7 @@ const SiteBtn = memo(({ siteItem, CODE }: { siteItem: SiteItem; CODE: string })
const { isSuccess, hasSubtitle, hasLeakage, targetLink } = status;
useEffect(() => {
xhr(siteItem, link, formatCode).then((res) => {
handleFetch(siteItem, link, formatCode).then((res) => {
setStatus({
isSuccess: res.isSuccess ? "fulfilled" : "rejected",
hasSubtitle: res.hasSubtitle,
@@ -31,7 +31,7 @@ const SiteBtn = memo(({ siteItem, CODE }: { siteItem: SiteItem; CODE: string })
targetLink: res.targetLink,
});
});
}, [xhr, siteItem, CODE, link]);
}, [handleFetch, siteItem, CODE, link]);
const colorClass =
isSuccess === "pedding"

View File

@@ -1,6 +1,6 @@
import { render } from "preact";
import { LibItem, libSites } from "@/utils/libSites";
import { getCode } from "@/utils/getCode";
import { libSites } from "@/utils/libSites";
import { getCode } from "@/utils";
import "@/style.css";
import App from "./components/App";

View File

@@ -1,16 +0,0 @@
import { type LibItem } from "./libSites";
export function getCode(libItem: LibItem): string {
const { codeQueryStr } = libItem.querys;
const codeNode = document.querySelector<HTMLElement>(codeQueryStr);
if (!codeNode) return "";
const codeText =
libItem.name === "javdb"
? (codeNode.dataset.clipboardText as string)
: codeNode.innerText.replace("复制", "");
if (codeText?.includes("FC2")) return codeText.split("-")[1];
return codeText;
}

46
src/utils/index.ts Normal file
View File

@@ -0,0 +1,46 @@
import { GM_xmlhttpRequest } from "$";
import { type LibItem } from "./libSites";
const isCaseInsensitiveEqual = (str1: string, str2: string) => {
return str1.toLowerCase() === str2.toLowerCase();
};
const isErrorCode = (resCode: number) => {
return [404, 403].includes(resCode);
};
const getCode = (libItem: LibItem): string => {
const { codeQueryStr } = libItem.querys;
const codeNode = document.querySelector<HTMLElement>(codeQueryStr);
if (!codeNode) return "";
const codeText =
libItem.name === "javdb"
? (codeNode.dataset.clipboardText as string)
: codeNode.innerText.replace("复制", "");
if (codeText?.includes("FC2")) return codeText.split("-")[1];
return codeText;
};
interface TResponse {
readonly responseHeaders: string;
readonly readyState: 0 | 1 | 2 | 3 | 4;
readonly response: any;
readonly responseText: string;
readonly responseXML: Document | null;
readonly status: number;
readonly statusText: string;
readonly finalUrl: string;
}
const gmFetch = ({ url }: { url: string }): Promise<TResponse> => {
return new Promise((resolve, reject) => {
GM_xmlhttpRequest({
method: "GET",
url,
onload: (response) => resolve(response),
onerror: (error) => reject(error),
});
});
};
export { isCaseInsensitiveEqual, isErrorCode, getCode, gmFetch };

View File

@@ -21,6 +21,7 @@ export const libSites: LibItem[] = [
codeQueryStr: `[data-clipboard-text]`,
},
method() {
// 一些样式调整
const columnVideoCover = document.querySelector<HTMLElement>(
".column-video-cover",
) as HTMLElement;

View File

@@ -1,7 +1,7 @@
import { GM_xmlhttpRequest } from "$";
import { gmFetch, isCaseInsensitiveEqual, isErrorCode } from "@/utils";
import type { DomQuery_get, DomQuery_parser, SiteItem } from "./siteList";
export type xhrResult = {
export type FetchResult = {
isSuccess: boolean;
targetLink: string;
hasSubtitle: boolean;
@@ -48,9 +48,6 @@ function serachPageParser(
const titleNode = titleQuery ? doc.querySelectorAll(titleQuery)[listIndex] : null;
const titleNodeText = titleNode ? titleNode?.outerHTML : "";
/** 空格版本的 code */
// const formatCode = spaceCode ? CODE.replace("-", " ") : CODE;
const codeRegex = /[a-zA-Z]{3,5}-\d{3,5}/;
const matchCode = titleNodeText.match(codeRegex);
const isSuccess =
@@ -71,128 +68,39 @@ function serachPageParser(
}
}
function xhr(siteItem: SiteItem, targetLink: string, CODE: string) {
const xhrPromise: Promise<xhrResult> = new Promise((resolve) => {
GM_xmlhttpRequest({
method: "GET",
url: targetLink,
onload: (response) => {
export const handleFetch = async (
siteItem: SiteItem,
targetLink: string,
CODE: string,
): Promise<FetchResult> => {
try {
const response = await gmFetch({ url: targetLink });
if (isErrorCode(response.status)) {
// 请求 404大概是对应网站没有资源
throw Error(String(response.status));
}
if (siteItem.fetcher === "get") {
// 直接 get 网页,且 get 结果为 404大概是对应网站没有资源
if (response.status === 404) {
resolve({
isSuccess: false,
targetLink,
hasSubtitle: false,
hasLeakage: false,
msg: "应该是没有资源",
});
}
// 直接 get 网页,成功,需要进一步解析 videoPage获取字幕等信息
else {
const { hasSubtitle, hasLeakage, isSuccess } = videoPageParser(
response.responseText,
siteItem.domQuery,
);
resolve({ isSuccess, targetLink, hasSubtitle, hasLeakage, msg: "[get],存在资源" });
}
}
// 需要解析 searchPage
else if (siteItem.fetcher === "parser") {
const { targetLink, isSuccess, hasLeakage, hasSubtitle } = serachPageParser(
response.responseText,
siteItem.domQuery,
siteItem.hostname,
CODE,
);
resolve({
isSuccess,
targetLink: isSuccess ? targetLink : targetLink,
hasSubtitle,
hasLeakage,
return {
...videoPageParser(response.responseText, siteItem.domQuery),
targetLink,
msg: "[get],存在资源",
};
} else {
// 需要解析 searchPage siteItem.fetcher === "parser"
return {
...serachPageParser(response.responseText, siteItem.domQuery, siteItem.hostname, CODE),
msg: "[parser]存在资源",
});
};
}
},
onerror: (error) => {
resolve({
} catch (error) {
return {
isSuccess: false,
targetLink: targetLink,
hasSubtitle: false,
hasLeakage: false,
msg: error.error,
});
},
});
});
return xhrPromise;
msg: String(error),
};
}
export default xhr;
function isCaseInsensitiveEqual(str1: string, str2: string) {
return str1.toLowerCase() === str2.toLowerCase();
}
/** 获取 javdb 的分数
* 没用了,白写
*/
// export function getDbScore(url: string): Promise<string> {
// return new Promise((resolve, reject) => {
// GM_xmlhttpRequest({
// method: "GET",
// url,
// onload: (response) => {
// const doc = new DOMParser().parseFromString(response.responseText, "text/html");
// const plist = doc.querySelector<HTMLElement>(`.panel.movie-panel-info`);
// const innerHtml = plist?.innerHTML;
// const matchResult = innerHtml?.match(/\d\.\d分/);
// if (!innerHtml || !matchResult) {
// reject("无评分");
// return;
// } else {
// resolve(matchResult[0]);
// }
// },
// onerror(error) {
// reject(error);
// },
// });
// });
// }
// interface dbResult {
// score: string;
// release: string;
// }
/** 没用了,白写 */
// export function parserJavdb(code?: string): Promise<dbResult> {
// return new Promise((resolve, reject) => {
// if (!code) reject("没找到");
// GM_xmlhttpRequest({
// url: `https://javdb005.com/search?q=${code}`,
// method: "GET",
// onload: (response) => {
// const doc = new DOMParser().parseFromString(response.responseText, "text/html");
// const firstItem = doc.querySelectorAll<HTMLElement>(`.movie-list>.item`)[0];
// const titleString = firstItem.querySelector<HTMLElement>(`.video-title>strong`)?.innerHTML;
// const releaseString = firstItem.querySelector<HTMLElement>(`.meta`)?.innerHTML.trim();
// if (titleString !== code || !releaseString) {
// reject("没找到");
// } else {
// const fullScoreText = firstItem.querySelector<HTMLElement>(`.score .value`)?.innerHTML;
// const matchResult = fullScoreText?.match(/\d\.\d*分/);
// if (!matchResult) reject("没找到");
// else
// resolve({
// // score: matchResult[0],
// score: matchResult[0].replace("分", ""),
// release: releaseString,
// });
// }
// },
// onerror(error) {
// reject(error);
// },
// });
// });
// }
};

View File

@@ -17,6 +17,7 @@
"jsx": "preserve",
"jsxFactory": "h",
"jsxFragmentFactory": "Fragment",
"baseUrl": "./",
"paths": { "@/*": ["./src/*"] }
},
"include": ["./src/**/*.ts", "./src/**/*.tsx"],