From f1fc11c81d1434979259e949043274ec8cc2aa98 Mon Sep 17 00:00:00 2001 From: mrbunker Date: Sat, 29 Jul 2023 15:14:37 +0800 Subject: [PATCH] refactor: xrh --- .vscode/{setting.json => settings.json} | 8 +- README.md | 1 + src/components/SiteBtn.tsx | 6 +- src/main.tsx | 4 +- src/utils/getCode.ts | 16 --- src/utils/index.ts | 46 +++++++ src/utils/libSites.ts | 1 + src/utils/xhr.ts | 166 ++++++------------------ tsconfig.json | 1 + 9 files changed, 95 insertions(+), 154 deletions(-) rename .vscode/{setting.json => settings.json} (96%) delete mode 100644 src/utils/getCode.ts create mode 100644 src/utils/index.ts diff --git a/.vscode/setting.json b/.vscode/settings.json similarity index 96% rename from .vscode/setting.json rename to .vscode/settings.json index 8a6e815..d5cd5d6 100644 --- a/.vscode/setting.json +++ b/.vscode/settings.json @@ -1,4 +1,4 @@ -{ - "editor.formatOnSaveMode": "modificationsIfAvailable", - "editor.defaultFormatter": "esbenp.prettier-vscode" -} +{ + "editor.formatOnSaveMode": "modificationsIfAvailable", + "editor.defaultFormatter": "esbenp.prettier-vscode" +} diff --git a/README.md b/README.md index 4c12355..daee0bb 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,4 @@ pnpm dev pnpm build pnpm preview ``` + diff --git a/src/components/SiteBtn.tsx b/src/components/SiteBtn.tsx index 7292f62..caca32f 100644 --- a/src/components/SiteBtn.tsx +++ b/src/components/SiteBtn.tsx @@ -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" diff --git a/src/main.tsx b/src/main.tsx index f1996ff..6d14b48 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -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"; diff --git a/src/utils/getCode.ts b/src/utils/getCode.ts deleted file mode 100644 index bf22cc6..0000000 --- a/src/utils/getCode.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { type LibItem } from "./libSites"; - -export function getCode(libItem: LibItem): string { - const { codeQueryStr } = libItem.querys; - const codeNode = document.querySelector(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; -} diff --git a/src/utils/index.ts b/src/utils/index.ts new file mode 100644 index 0000000..fca9656 --- /dev/null +++ b/src/utils/index.ts @@ -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(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 => { + return new Promise((resolve, reject) => { + GM_xmlhttpRequest({ + method: "GET", + url, + onload: (response) => resolve(response), + onerror: (error) => reject(error), + }); + }); +}; + +export { isCaseInsensitiveEqual, isErrorCode, getCode, gmFetch }; diff --git a/src/utils/libSites.ts b/src/utils/libSites.ts index daa5034..0ded2ba 100644 --- a/src/utils/libSites.ts +++ b/src/utils/libSites.ts @@ -21,6 +21,7 @@ export const libSites: LibItem[] = [ codeQueryStr: `[data-clipboard-text]`, }, method() { + // 一些样式调整 const columnVideoCover = document.querySelector( ".column-video-cover", ) as HTMLElement; diff --git a/src/utils/xhr.ts b/src/utils/xhr.ts index 425edf0..20dc4f7 100644 --- a/src/utils/xhr.ts +++ b/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 = new Promise((resolve) => { - GM_xmlhttpRequest({ - method: "GET", - url: targetLink, - onload: (response) => { - 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, - msg: "[parser]存在资源", - }); - } - }, - onerror: (error) => { - resolve({ - isSuccess: false, - targetLink: targetLink, - hasSubtitle: false, - hasLeakage: false, - msg: error.error, - }); - }, - }); - }); - return xhrPromise; -} -export default xhr; +export const handleFetch = async ( + siteItem: SiteItem, + targetLink: string, + CODE: string, +): Promise => { + try { + const response = await gmFetch({ url: targetLink }); + if (isErrorCode(response.status)) { + // 请求 404,大概是对应网站没有资源 + throw Error(String(response.status)); + } -function isCaseInsensitiveEqual(str1: string, str2: string) { - return str1.toLowerCase() === str2.toLowerCase(); -} - -/** 获取 javdb 的分数 - * 没用了,白写 - */ -// export function getDbScore(url: string): Promise { -// 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(`.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 { -// 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(`.movie-list>.item`)[0]; -// const titleString = firstItem.querySelector(`.video-title>strong`)?.innerHTML; -// const releaseString = firstItem.querySelector(`.meta`)?.innerHTML.trim(); -// if (titleString !== code || !releaseString) { -// reject("没找到"); -// } else { -// const fullScoreText = firstItem.querySelector(`.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); -// }, -// }); -// }); -// } + if (siteItem.fetcher === "get") { + // 直接 get 网页,成功,需要进一步解析 videoPage,获取字幕等信息 + 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]存在资源", + }; + } + } catch (error) { + return { + isSuccess: false, + targetLink: targetLink, + hasSubtitle: false, + hasLeakage: false, + msg: String(error), + }; + } +}; diff --git a/tsconfig.json b/tsconfig.json index 58e88f8..2f42c83 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -17,6 +17,7 @@ "jsx": "preserve", "jsxFactory": "h", "jsxFragmentFactory": "Fragment", + "baseUrl": "./", "paths": { "@/*": ["./src/*"] } }, "include": ["./src/**/*.ts", "./src/**/*.tsx"],