From 9b707c1a17bc42cb11cb5b84c72d4f32715e37cf Mon Sep 17 00:00:00 2001 From: mtvpls Date: Tue, 7 Apr 2026 16:58:22 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=B8=E5=85=8B=E7=BD=91=E7=9B=98=E8=BD=AC?= =?UTF-8?q?=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/admin/page.tsx | 226 ++++++++++++ src/app/api/admin/netdisk/route.ts | 85 +++++ src/app/api/quark/instant-play/route.ts | 67 ++++ src/app/api/quark/transfer/route.ts | 44 +++ src/app/api/source-detail/route.ts | 127 ++++++- src/app/play/page.tsx | 4 + src/components/PansouSearch.tsx | 84 ++++- src/lib/admin.types.ts | 9 + src/lib/config.ts | 22 ++ src/lib/quark.client.ts | 471 ++++++++++++++++++++++++ 10 files changed, 1132 insertions(+), 7 deletions(-) create mode 100644 src/app/api/admin/netdisk/route.ts create mode 100644 src/app/api/quark/instant-play/route.ts create mode 100644 src/app/api/quark/transfer/route.ts create mode 100644 src/lib/quark.client.ts diff --git a/src/app/admin/page.tsx b/src/app/admin/page.tsx index b9700ce..1f5a406 100644 --- a/src/app/admin/page.tsx +++ b/src/app/admin/page.tsx @@ -30,6 +30,7 @@ import { CheckCircle, ChevronDown, ChevronUp, + Cloud, Database, ExternalLink, FileText, @@ -3499,6 +3500,219 @@ const OpenListConfigComponent = ({ ); }; +const NetDiskConfigComponent = ({ + config, + refreshConfig, +}: { + config: AdminConfig | null; + refreshConfig: () => Promise; +}) => { + const { alertModal, showAlert, hideAlert } = useAlertModal(); + const { isLoading, withLoading } = useLoadingState(); + const [enabled, setEnabled] = useState(false); + const [cookie, setCookie] = useState(''); + const [savePath, setSavePath] = useState('/'); + const [playTempSavePath, setPlayTempSavePath] = useState('/'); + const [openListTempPath, setOpenListTempPath] = useState('/'); + + useEffect(() => { + const quark = config?.NetDiskConfig?.Quark; + setEnabled(quark?.Enabled || false); + setCookie(quark?.Cookie || ''); + setSavePath(quark?.SavePath || '/'); + setPlayTempSavePath(quark?.PlayTempSavePath || '/'); + setOpenListTempPath(quark?.OpenListTempPath || '/'); + }, [config]); + + const handleSave = async () => { + await withLoading('saveNetDisk', async () => { + const response = await fetch('/api/admin/netdisk', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + action: 'save', + Quark: { + Enabled: enabled, + Cookie: cookie, + SavePath: savePath, + PlayTempSavePath: playTempSavePath, + OpenListTempPath: openListTempPath, + }, + }), + }); + + const data = await response.json(); + if (!response.ok) { + throw new Error(data.error || '保存失败'); + } + + showSuccess('保存成功', showAlert); + await refreshConfig(); + }); + }; + + const handleValidate = async () => { + await withLoading('validateNetDisk', async () => { + try { + const response = await fetch('/api/admin/netdisk', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + action: 'validate', + Quark: { + Cookie: cookie, + SavePath: savePath, + PlayTempSavePath: playTempSavePath, + }, + }), + }); + + const data = await response.json(); + if (!response.ok) { + throw new Error(data.error || '校验失败'); + } + + showSuccess(data.message || '夸克 Cookie 可读', showAlert); + } catch (error) { + showError(error instanceof Error ? error.message : '校验失败', showAlert); + throw error; + } + }); + }; + + return ( +
+
+ + 夸克网盘 + +
+
+
+ + + 夸克网盘说明 + +
+
+

• 转存:把整个分享保存到夸克正式目录。

+

• 立即播放:将分享内所有视频文件转存到临时播放目录,再通过 OpenList 临时目录直接播放。

+

• OpenList 临时目录必须映射到夸克临时播放目录,否则立即播放无法找到文件。

+
+
+ +
+
+

+ 启用夸克网盘 +

+

+ 开启后,网盘搜索中的夸克资源会显示“立即播放”和“转存”按钮 +

+
+ +
+ +
+ +