57 lines
1.7 KiB
TypeScript
57 lines
1.7 KiB
TypeScript
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
|
|
import { NextRequest, NextResponse } from 'next/server';
|
|
|
|
import { getCachedEmbyViews, setCachedEmbyViews } from '@/lib/emby-cache';
|
|
import { embyManager } from '@/lib/emby-manager';
|
|
import { requireFeaturePermission } from '@/lib/permissions';
|
|
|
|
export const runtime = 'nodejs';
|
|
|
|
export async function GET(request: NextRequest) {
|
|
try {
|
|
const authResult = await requireFeaturePermission(request, 'emby', '无权限访问 Emby');
|
|
if (authResult instanceof NextResponse) return authResult;
|
|
const { searchParams } = new URL(request.url);
|
|
const embyKey = searchParams.get('embyKey') || undefined;
|
|
|
|
// 检查缓存(按embyKey缓存)
|
|
const cacheKey = embyKey || 'default';
|
|
const cached = getCachedEmbyViews(cacheKey);
|
|
if (cached) {
|
|
return NextResponse.json(cached);
|
|
}
|
|
|
|
// 获取Emby客户端
|
|
const client = await embyManager.getClient(embyKey);
|
|
|
|
// 获取媒体库列表
|
|
const views = await client.getUserViews();
|
|
|
|
// 过滤出电影和电视剧媒体库
|
|
const filteredViews = views.filter(
|
|
(view) => view.CollectionType === 'movies' || view.CollectionType === 'tvshows'
|
|
);
|
|
|
|
const response = {
|
|
success: true,
|
|
views: filteredViews.map((view) => ({
|
|
id: view.Id,
|
|
name: view.Name,
|
|
type: view.CollectionType,
|
|
})),
|
|
};
|
|
|
|
// 缓存结果
|
|
setCachedEmbyViews(cacheKey, response);
|
|
|
|
return NextResponse.json(response);
|
|
} catch (error) {
|
|
console.error('获取 Emby 媒体库列表失败:', error);
|
|
return NextResponse.json({
|
|
error: '获取 Emby 媒体库列表失败: ' + (error as Error).message,
|
|
views: [],
|
|
});
|
|
}
|
|
}
|