From 204eec782fb190c61aeada440452d01d5d9a980c Mon Sep 17 00:00:00 2001 From: mtvpls Date: Wed, 8 Apr 2026 18:03:18 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4api=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/admin/page.tsx | 345 +----------------- src/app/api/admin/netdisk/route.ts | 2 +- .../{ => netdisk}/quark/instant-play/route.ts | 2 +- .../api/{ => netdisk}/quark/transfer/route.ts | 2 +- src/components/PansouSearch.tsx | 4 +- src/lib/{ => netdisk}/quark.client.ts | 0 6 files changed, 7 insertions(+), 348 deletions(-) rename src/app/api/{ => netdisk}/quark/instant-play/route.ts (97%) rename src/app/api/{ => netdisk}/quark/transfer/route.ts (94%) rename src/lib/{ => netdisk}/quark.client.ts (100%) diff --git a/src/app/admin/page.tsx b/src/app/admin/page.tsx index 9daf1a6..263c6ff 100644 --- a/src/app/admin/page.tsx +++ b/src/app/admin/page.tsx @@ -7771,349 +7771,8 @@ const ThemeConfigComponent = ({ ); }; -// 音乐配置组件 -export const MusicConfigComponent = ({ - config, - refreshConfig, -}: { - config: AdminConfig | null; - refreshConfig: () => Promise; -}) => { - const { alertModal, showAlert, hideAlert } = useAlertModal(); - const { isLoading, withLoading } = useLoadingState(); - - const [musicSettings, setMusicSettings] = useState({ - TuneHubEnabled: false, - TuneHubBaseUrl: 'https://tunehub.sayqz.com/api', - TuneHubApiKey: '', - OpenListCacheEnabled: false, - OpenListCacheURL: '', - OpenListCacheUsername: '', - OpenListCachePassword: '', - OpenListCachePath: '/music-cache', - OpenListCacheProxyEnabled: true, - }); - - // 从配置加载音乐设置 - useEffect(() => { - if (config?.MusicConfig) { - setMusicSettings({ - TuneHubEnabled: config.MusicConfig.TuneHubEnabled ?? false, - TuneHubBaseUrl: config.MusicConfig.TuneHubBaseUrl ?? 'https://tunehub.sayqz.com/api', - TuneHubApiKey: config.MusicConfig.TuneHubApiKey ?? '', - OpenListCacheEnabled: config.MusicConfig.OpenListCacheEnabled ?? false, - OpenListCacheURL: config.MusicConfig.OpenListCacheURL ?? '', - OpenListCacheUsername: config.MusicConfig.OpenListCacheUsername ?? '', - OpenListCachePassword: config.MusicConfig.OpenListCachePassword ?? '', - OpenListCachePath: config.MusicConfig.OpenListCachePath ?? '/music-cache', - OpenListCacheProxyEnabled: config.MusicConfig.OpenListCacheProxyEnabled ?? true, - }); - } - }, [config]); - - const handleSave = async () => { - await withLoading('saveMusicConfig', async () => { - try { - const resp = await fetch('/api/admin/music', { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ ...musicSettings }), - }); - - if (!resp.ok) { - const data = await resp.json().catch(() => ({})); - throw new Error(data.error || '保存失败'); - } - - showAlert({ type: 'success', title: '保存成功', message: '音乐配置已更新', timer: 2000 }); - await refreshConfig(); - } catch (error: any) { - showAlert({ type: 'error', title: '保存失败', message: error.message || '未知错误', showConfirm: true }); - } - }); - }; - - return ( -
- {/* TuneHub 音乐配置 */} -
-

- TuneHub 音乐配置 -

- - {/* 开启音乐功能 */} -
-
- - -
-

- 开启后将在首页显示音乐视听入口,支持网易云、QQ音乐、酷我音乐 -

-
- - {/* TuneHub Base URL */} -
- - - setMusicSettings((prev) => ({ - ...prev, - TuneHubBaseUrl: e.target.value, - })) - } - className='w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-green-500 focus:border-transparent' - /> -

- TuneHub API 的基础地址,默认为 https://tunehub.sayqz.com/api。也可以通过环境变量 TUNEHUB_BASE_URL 配置 -

-
- - {/* TuneHub API Key */} -
- - - setMusicSettings((prev) => ({ - ...prev, - TuneHubApiKey: e.target.value, - })) - } - className='w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-green-500 focus:border-transparent' - /> -

- 用于解析歌曲播放链接的 API Key(消耗积分)。搜索、榜单、歌单等功能不需要 Key。也可以通过环境变量 TUNEHUB_API_KEY 配置 -

-
-
- - {/* OpenList 缓存配置 */} -
-

- OpenList 缓存配置 -

- - {/* 开启 OpenList 缓存 */} -
-
- - -
-

- 开启后将音乐解析结果(播放链接、歌词、元信息)和音频文件缓存到 OpenList,减少 API 调用次数并支持离线播放 -

-
- - {/* OpenList URL */} -
- - - setMusicSettings((prev) => ({ - ...prev, - OpenListCacheURL: e.target.value, - })) - } - className='w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-green-500 focus:border-transparent' - /> -

- OpenList 服务器的完整地址(例如:https://your-openlist-server.com) -

-
- - {/* OpenList 用户名 */} -
- - - setMusicSettings((prev) => ({ - ...prev, - OpenListCacheUsername: e.target.value, - })) - } - className='w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-green-500 focus:border-transparent' - /> -
- - {/* OpenList 密码 */} -
- - - setMusicSettings((prev) => ({ - ...prev, - OpenListCachePassword: e.target.value, - })) - } - className='w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-green-500 focus:border-transparent' - /> -

- 用于登录 OpenList 并获取访问权限 -

-
- - {/* OpenList 缓存目录 */} -
- - - setMusicSettings((prev) => ({ - ...prev, - OpenListCachePath: e.target.value, - })) - } - className='w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-green-500 focus:border-transparent' - /> -

- 音乐缓存在 OpenList 中的存储目录(例如:/music-cache) -

-
- - {/* 缓存代理返回开关 */} -
-
- - -
-

- 开启后,如果 OpenList 有缓存,将通过代理方式返回给前端,并设置永久缓存头,提升加载速度 -

-
-
- - {/* 操作按钮 */} -
- -
- - {/* 弹窗 */} - -
- ); -}; +// 音乐配置组件(已停用) +// const MusicConfigComponent = (...) => { ... } // 新增站点配置组件 const SiteConfigComponent = ({ diff --git a/src/app/api/admin/netdisk/route.ts b/src/app/api/admin/netdisk/route.ts index 70795df..0536e66 100644 --- a/src/app/api/admin/netdisk/route.ts +++ b/src/app/api/admin/netdisk/route.ts @@ -9,7 +9,7 @@ import { assertQuarkCookieHeaderSafe, normalizeQuarkCookie, validateQuarkCookieReadable, -} from '@/lib/quark.client'; +} from '@/lib/netdisk/quark.client'; export const runtime = 'nodejs'; diff --git a/src/app/api/quark/instant-play/route.ts b/src/app/api/netdisk/quark/instant-play/route.ts similarity index 97% rename from src/app/api/quark/instant-play/route.ts rename to src/app/api/netdisk/quark/instant-play/route.ts index 75c2407..1e47de2 100644 --- a/src/app/api/quark/instant-play/route.ts +++ b/src/app/api/netdisk/quark/instant-play/route.ts @@ -2,7 +2,7 @@ import { NextRequest, NextResponse } from 'next/server'; import { getAuthInfoFromCookie } from '@/lib/auth'; import { getConfig } from '@/lib/config'; -import { createQuarkInstantPlayFolder } from '@/lib/quark.client'; +import { createQuarkInstantPlayFolder } from '@/lib/netdisk/quark.client'; import { base58Encode } from '@/lib/utils'; export const runtime = 'nodejs'; diff --git a/src/app/api/quark/transfer/route.ts b/src/app/api/netdisk/quark/transfer/route.ts similarity index 94% rename from src/app/api/quark/transfer/route.ts rename to src/app/api/netdisk/quark/transfer/route.ts index 9009b83..fe0201b 100644 --- a/src/app/api/quark/transfer/route.ts +++ b/src/app/api/netdisk/quark/transfer/route.ts @@ -2,7 +2,7 @@ import { NextRequest, NextResponse } from 'next/server'; import { getAuthInfoFromCookie } from '@/lib/auth'; import { getConfig } from '@/lib/config'; -import { transferQuarkShare } from '@/lib/quark.client'; +import { transferQuarkShare } from '@/lib/netdisk/quark.client'; export const runtime = 'nodejs'; diff --git a/src/components/PansouSearch.tsx b/src/components/PansouSearch.tsx index 72e830b..b9136c5 100644 --- a/src/components/PansouSearch.tsx +++ b/src/components/PansouSearch.tsx @@ -125,7 +125,7 @@ export default function PansouSearch({ const handleQuarkTransfer = async (link: PansouLink) => { try { setTransferingUrl(link.url); - const response = await fetch('/api/quark/transfer', { + const response = await fetch('/api/netdisk/quark/transfer', { method: 'POST', headers: { 'Content-Type': 'application/json', @@ -152,7 +152,7 @@ export default function PansouSearch({ const handleQuarkInstantPlay = async (link: PansouLink) => { try { setPlayingUrl(link.url); - const response = await fetch('/api/quark/instant-play', { + const response = await fetch('/api/netdisk/quark/instant-play', { method: 'POST', headers: { 'Content-Type': 'application/json', diff --git a/src/lib/quark.client.ts b/src/lib/netdisk/quark.client.ts similarity index 100% rename from src/lib/quark.client.ts rename to src/lib/netdisk/quark.client.ts