openlist多目录支持

This commit is contained in:
mtvpls
2026-01-10 10:25:14 +08:00
parent afdf0b7af5
commit 00a5055817
17 changed files with 212 additions and 66 deletions

View File

@@ -26,7 +26,7 @@ export async function POST(request: NextRequest) {
try {
const body = await request.json();
const { action, Enabled, URL, Username, Password, RootPath, OfflineDownloadPath, ScanInterval, ScanMode } = body;
const { action, Enabled, URL, Username, Password, RootPaths, OfflineDownloadPath, ScanInterval, ScanMode } = body;
const authInfo = getAuthInfoFromCookie(request);
if (!authInfo || !authInfo.username) {
@@ -53,7 +53,7 @@ export async function POST(request: NextRequest) {
URL: URL || '',
Username: Username || '',
Password: Password || '',
RootPath: RootPath || '/',
RootPaths: RootPaths || ['/'],
OfflineDownloadPath: OfflineDownloadPath || '/',
LastRefreshTime: adminConfig.OpenListConfig?.LastRefreshTime,
ResourceCount: adminConfig.OpenListConfig?.ResourceCount,
@@ -77,6 +77,14 @@ export async function POST(request: NextRequest) {
);
}
// 验证 RootPaths
if (!Array.isArray(RootPaths) || RootPaths.length === 0) {
return NextResponse.json(
{ error: '请至少提供一个根目录' },
{ status: 400 }
);
}
// 验证扫描间隔
let scanInterval = parseInt(ScanInterval) || 0;
if (scanInterval > 0 && scanInterval < 60) {
@@ -104,7 +112,7 @@ export async function POST(request: NextRequest) {
URL,
Username,
Password,
RootPath: RootPath || '/',
RootPaths,
OfflineDownloadPath: OfflineDownloadPath || '/',
LastRefreshTime: adminConfig.OpenListConfig?.LastRefreshTime,
ResourceCount: adminConfig.OpenListConfig?.ResourceCount,

View File

@@ -268,14 +268,14 @@ async function handleOpenListProxy(request: NextRequest) {
);
// 读取 metainfo (从数据库或缓存)
let metaInfo: MetaInfo | null = getCachedMetaInfo(rootPath);
let metaInfo: MetaInfo | null = getCachedMetaInfo();
if (!metaInfo) {
try {
const metainfoJson = await db.getGlobalValue('video.metainfo');
if (metainfoJson) {
metaInfo = JSON.parse(metainfoJson) as MetaInfo;
setCachedMetaInfo(rootPath, metaInfo);
setCachedMetaInfo(metaInfo);
}
} catch (error) {
return NextResponse.json(

View File

@@ -45,13 +45,13 @@ export async function GET(request: NextRequest) {
const { getCachedMetaInfo, setCachedMetaInfo } = await import('@/lib/openlist-cache');
const { db } = await import('@/lib/db');
metaInfo = getCachedMetaInfo(rootPath);
metaInfo = getCachedMetaInfo();
if (!metaInfo) {
const metainfoJson = await db.getGlobalValue('video.metainfo');
if (metainfoJson) {
metaInfo = JSON.parse(metainfoJson);
setCachedMetaInfo(rootPath, metaInfo);
setCachedMetaInfo(metaInfo);
}
}

View File

@@ -76,7 +76,7 @@ export async function GET(
const { getCachedMetaInfo, setCachedMetaInfo } = await import('@/lib/openlist-cache');
const { db } = await import('@/lib/db');
let metaInfo = getCachedMetaInfo(rootPath);
let metaInfo = getCachedMetaInfo();
if (!metaInfo) {
try {
@@ -84,7 +84,7 @@ export async function GET(
if (metainfoJson) {
metaInfo = JSON.parse(metainfoJson);
if (metaInfo) {
setCachedMetaInfo(rootPath, metaInfo);
setCachedMetaInfo(metaInfo);
}
}
} catch (error) {

View File

@@ -65,7 +65,6 @@ export async function POST(request: NextRequest) {
);
}
const rootPath = openListConfig.RootPath || '/';
const client = new OpenListClient(
openListConfig.URL,
openListConfig.Username,
@@ -73,7 +72,7 @@ export async function POST(request: NextRequest) {
);
// 读取现有 metainfo (从数据库或缓存)
let metaInfo: MetaInfo | null = getCachedMetaInfo(rootPath);
let metaInfo: MetaInfo | null = getCachedMetaInfo();
if (!metaInfo) {
try {
@@ -132,8 +131,8 @@ export async function POST(request: NextRequest) {
await db.setGlobalValue('video.metainfo', metainfoContent);
// 更新缓存
invalidateMetaInfoCache(rootPath);
setCachedMetaInfo(rootPath, metaInfo);
invalidateMetaInfoCache();
setCachedMetaInfo(metaInfo);
return NextResponse.json({
success: true,

View File

@@ -49,8 +49,6 @@ export async function POST(request: NextRequest) {
);
}
const rootPath = openListConfig.RootPath || '/';
// 从数据库读取 metainfo
const metainfoContent = await db.getGlobalValue('video.metainfo');
if (!metainfoContent) {
@@ -78,8 +76,8 @@ export async function POST(request: NextRequest) {
await db.setGlobalValue('video.metainfo', updatedMetainfoContent);
// 更新缓存
invalidateMetaInfoCache(rootPath);
setCachedMetaInfo(rootPath, metaInfo);
invalidateMetaInfoCache();
setCachedMetaInfo(metaInfo);
// 更新配置中的资源数量
if (config.OpenListConfig) {

View File

@@ -45,8 +45,8 @@ export async function GET(request: NextRequest) {
return NextResponse.json({ error: 'OpenList 未配置或未启用' }, { status: 400 });
}
const rootPath = openListConfig.RootPath || '/';
const folderPath = `${rootPath}${rootPath.endsWith('/') ? '' : '/'}${folderName}`;
// folderName 已经是完整路径,直接使用
const folderPath = folderName;
const client = new OpenListClient(
openListConfig.URL,
openListConfig.Username,

View File

@@ -48,7 +48,6 @@ export async function GET(request: NextRequest) {
);
}
const rootPath = openListConfig.RootPath || '/';
const client = new OpenListClient(
openListConfig.URL,
openListConfig.Username,
@@ -62,7 +61,7 @@ export async function GET(request: NextRequest) {
if (noCache) {
// noCache 模式:跳过缓存
} else {
metaInfo = getCachedMetaInfo(rootPath);
metaInfo = getCachedMetaInfo();
}
if (!metaInfo) {
@@ -83,7 +82,7 @@ export async function GET(request: NextRequest) {
// 只有在不是 noCache 模式时才更新缓存
if (!noCache) {
setCachedMetaInfo(rootPath, metaInfo);
setCachedMetaInfo(metaInfo);
}
} catch (parseError) {
console.error('[OpenList List] JSON 解析或验证失败:', parseError);

View File

@@ -41,8 +41,8 @@ export async function GET(request: NextRequest) {
return NextResponse.json({ error: 'OpenList 未配置或未启用' }, { status: 400 });
}
const rootPath = openListConfig.RootPath || '/';
const folderPath = `${rootPath}${rootPath.endsWith('/') ? '' : '/'}${folderName}`;
// folderName 已经是完整路径,直接使用
const folderPath = folderName;
const filePath = `${folderPath}/${fileName}`;
const client = new OpenListClient(

View File

@@ -40,8 +40,8 @@ export async function POST(request: NextRequest) {
return NextResponse.json({ error: 'OpenList 未配置或未启用' }, { status: 400 });
}
const rootPath = openListConfig.RootPath || '/';
const folderPath = `${rootPath}${rootPath.endsWith('/') ? '' : '/'}${folder}`;
// folder 已经是完整路径,直接使用
const folderPath = folder;
const client = new OpenListClient(
openListConfig.URL,
openListConfig.Username,

View File

@@ -105,15 +105,14 @@ export async function GET(request: NextRequest) {
const { getTMDBImageUrl } = await import('@/lib/tmdb.search');
const { db } = await import('@/lib/db');
const rootPath = config.OpenListConfig!.RootPath || '/';
let metaInfo = getCachedMetaInfo(rootPath);
let metaInfo = getCachedMetaInfo();
if (!metaInfo) {
const metainfoJson = await db.getGlobalValue('video.metainfo');
if (metainfoJson) {
metaInfo = JSON.parse(metainfoJson);
if (metaInfo) {
setCachedMetaInfo(rootPath, metaInfo);
setCachedMetaInfo(metaInfo);
}
}
}

View File

@@ -213,15 +213,14 @@ export async function GET(request: NextRequest) {
const { getTMDBImageUrl } = await import('@/lib/tmdb.search');
const { db } = await import('@/lib/db');
const rootPath = config.OpenListConfig!.RootPath || '/';
let metaInfo = getCachedMetaInfo(rootPath);
let metaInfo = getCachedMetaInfo();
if (!metaInfo) {
const metainfoJson = await db.getGlobalValue('video.metainfo');
if (metainfoJson) {
metaInfo = JSON.parse(metainfoJson);
if (metaInfo) {
setCachedMetaInfo(rootPath, metaInfo);
setCachedMetaInfo(metaInfo);
}
}
}

View File

@@ -149,13 +149,13 @@ export async function GET(request: NextRequest) {
const { getCachedMetaInfo, setCachedMetaInfo } = await import('@/lib/openlist-cache');
const { db } = await import('@/lib/db');
metaInfo = getCachedMetaInfo(rootPath);
metaInfo = getCachedMetaInfo();
if (!metaInfo) {
const metainfoJson = await db.getGlobalValue('video.metainfo');
if (metainfoJson) {
metaInfo = JSON.parse(metainfoJson);
setCachedMetaInfo(rootPath, metaInfo);
setCachedMetaInfo(metaInfo);
}
}