diff --git a/src/app/admin/page.tsx b/src/app/admin/page.tsx index 29563d4..be43d06 100644 --- a/src/app/admin/page.tsx +++ b/src/app/admin/page.tsx @@ -3486,6 +3486,30 @@ const EmbyConfigComponent = ({ }); }; + const handleClearCache = async () => { + await withLoading('clearEmbyCache', async () => { + try { + const response = await fetch('/api/admin/emby', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + action: 'clearCache', + }), + }); + + const data = await response.json(); + + if (data.success) { + showSuccess(data.message || '缓存清除成功', showAlert); + } else { + showError(data.message || '缓存清除失败', showAlert); + } + } catch (error) { + showError(error instanceof Error ? error.message : '缓存清除失败', showAlert); + } + }); + }; + return (
+ + {/* 清除缓存按钮 */} +
+ +
); }; diff --git a/src/app/api/admin/emby/route.ts b/src/app/api/admin/emby/route.ts index 0186660..a4b5c9b 100644 --- a/src/app/api/admin/emby/route.ts +++ b/src/app/api/admin/emby/route.ts @@ -6,6 +6,7 @@ import { getAuthInfoFromCookie } from '@/lib/auth'; import { getConfig } from '@/lib/config'; import { db } from '@/lib/db'; import { EmbyClient } from '@/lib/emby.client'; +import { clearEmbyCache } from '@/lib/emby-cache'; export const runtime = 'nodejs'; @@ -176,6 +177,16 @@ export async function POST(request: NextRequest) { }); } + if (action === 'clearCache') { + // 清除缓存 + const result = clearEmbyCache(); + return NextResponse.json({ + success: true, + message: `已清除 ${result.cleared} 条 Emby 缓存`, + cleared: result.cleared, + }); + } + return NextResponse.json({ error: '不支持的操作' }, { status: 400 }); } catch (error) { console.error('Emby 配置保存失败:', error); diff --git a/src/app/api/emby/list/route.ts b/src/app/api/emby/list/route.ts index c0df1ba..98cfe20 100644 --- a/src/app/api/emby/list/route.ts +++ b/src/app/api/emby/list/route.ts @@ -4,6 +4,7 @@ import { NextRequest, NextResponse } from 'next/server'; import { getConfig } from '@/lib/config'; import { EmbyClient } from '@/lib/emby.client'; +import { getCachedEmbyList, setCachedEmbyList } from '@/lib/emby-cache'; export const runtime = 'nodejs'; @@ -13,6 +14,12 @@ export async function GET(request: NextRequest) { const pageSize = parseInt(searchParams.get('pageSize') || '20'); try { + // 检查缓存 + const cached = getCachedEmbyList(page, pageSize); + if (cached) { + return NextResponse.json(cached); + } + const config = await getConfig(); const embyConfig = config.EmbyConfig; @@ -78,13 +85,18 @@ export async function GET(request: NextRequest) { const totalPages = Math.ceil(result.TotalRecordCount / pageSize); - return NextResponse.json({ + const response = { success: true, list, totalPages, currentPage: page, total: result.TotalRecordCount, - }); + }; + + // 缓存结果 + setCachedEmbyList(page, pageSize, response); + + return NextResponse.json(response); } catch (error) { console.error('获取 Emby 列表失败:', error); return NextResponse.json({ diff --git a/src/lib/emby-cache.ts b/src/lib/emby-cache.ts new file mode 100644 index 0000000..c24f162 --- /dev/null +++ b/src/lib/emby-cache.ts @@ -0,0 +1,76 @@ +// Emby 缓存模块 - 用于缓存 Emby 媒体库数据 + +// 缓存条目接口 +export interface EmbyCachedEntry { + expiresAt: number; + data: T; +} + +// 缓存配置 +const EMBY_CACHE_TTL_MS = 6 * 60 * 60 * 1000; // 6小时 +const EMBY_CACHE: Map> = new Map(); + +/** + * 生成 Emby 列表缓存键 + */ +function makeListCacheKey(page: number, pageSize: number): string { + return `emby:list:${page}:${pageSize}`; +} + +/** + * 获取缓存的 Emby 列表数据 + */ +export function getCachedEmbyList( + page: number, + pageSize: number +): any | null { + const key = makeListCacheKey(page, pageSize); + const entry = EMBY_CACHE.get(key); + if (!entry) return null; + + // 检查是否过期 + if (entry.expiresAt <= Date.now()) { + EMBY_CACHE.delete(key); + return null; + } + + return entry.data; +} + +/** + * 设置缓存的 Emby 列表数据 + */ +export function setCachedEmbyList( + page: number, + pageSize: number, + data: any +): void { + const now = Date.now(); + const key = makeListCacheKey(page, pageSize); + EMBY_CACHE.set(key, { + expiresAt: now + EMBY_CACHE_TTL_MS, + data, + }); +} + +/** + * 清除所有 Emby 缓存 + */ +export function clearEmbyCache(): { cleared: number } { + const size = EMBY_CACHE.size; + EMBY_CACHE.clear(); + return { cleared: size }; +} + +/** + * 获取缓存统计信息 + */ +export function getEmbyCacheStats(): { + size: number; + keys: string[]; +} { + return { + size: EMBY_CACHE.size, + keys: Array.from(EMBY_CACHE.keys()), + }; +}