refactor: xrh
This commit is contained in:
@@ -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"
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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
46
src/utils/index.ts
Normal 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 };
|
||||
@@ -21,6 +21,7 @@ export const libSites: LibItem[] = [
|
||||
codeQueryStr: `[data-clipboard-text]`,
|
||||
},
|
||||
method() {
|
||||
// 一些样式调整
|
||||
const columnVideoCover = document.querySelector<HTMLElement>(
|
||||
".column-video-cover",
|
||||
) as HTMLElement;
|
||||
|
||||
152
src/utils/xhr.ts
152
src/utils/xhr.ts
@@ -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;
|
||||
}
|
||||
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);
|
||||
// },
|
||||
// });
|
||||
// });
|
||||
// }
|
||||
msg: String(error),
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
"jsx": "preserve",
|
||||
"jsxFactory": "h",
|
||||
"jsxFragmentFactory": "Fragment",
|
||||
"baseUrl": "./",
|
||||
"paths": { "@/*": ["./src/*"] }
|
||||
},
|
||||
"include": ["./src/**/*.ts", "./src/**/*.tsx"],
|
||||
|
||||
Reference in New Issue
Block a user