From 2e025eabfbc922038b64bdfa2d07a86871247bd5 Mon Sep 17 00:00:00 2001 From: mtvpls Date: Fri, 2 Jan 2026 16:49:51 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=A7=81=E4=BA=BA=E5=BD=B1?= =?UTF-8?q?=E5=BA=93=E5=88=86=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/api/detail/route.ts | 25 +++++++++-- .../api/openlist/cms-proxy/[token]/route.ts | 41 +++++++++++++------ src/app/api/source-detail/route.ts | 25 +++++++++-- 3 files changed, 71 insertions(+), 20 deletions(-) diff --git a/src/app/api/detail/route.ts b/src/app/api/detail/route.ts index 278db00..b26f4e5 100644 --- a/src/app/api/detail/route.ts +++ b/src/app/api/detail/route.ts @@ -81,14 +81,31 @@ export async function GET(request: NextRequest) { let videoInfo = getCachedVideoInfo(folderPath); - const listResponse = await client.listDirectory(folderPath); + // 获取所有分页的视频文件 + const allFiles: any[] = []; + let currentPage = 1; + const pageSize = 100; + let total = 0; - if (listResponse.code !== 200) { - throw new Error('OpenList 列表获取失败'); + while (true) { + const listResponse = await client.listDirectory(folderPath, currentPage, pageSize); + + if (listResponse.code !== 200) { + throw new Error('OpenList 列表获取失败'); + } + + total = listResponse.data.total; + allFiles.push(...listResponse.data.content); + + if (allFiles.length >= total) { + break; + } + + currentPage++; } const videoExtensions = ['.mp4', '.mkv', '.avi', '.m3u8', '.flv', '.ts', '.mov', '.wmv', '.webm', '.rmvb', '.rm', '.mpg', '.mpeg', '.3gp', '.f4v', '.m4v', '.vob']; - const videoFiles = listResponse.data.content.filter((item) => { + const videoFiles = allFiles.filter((item) => { if (item.is_dir || item.name.startsWith('.') || item.name.endsWith('.json')) return false; return videoExtensions.some(ext => item.name.toLowerCase().endsWith(ext)); }); diff --git a/src/app/api/openlist/cms-proxy/[token]/route.ts b/src/app/api/openlist/cms-proxy/[token]/route.ts index 555054e..7f5e6ab 100644 --- a/src/app/api/openlist/cms-proxy/[token]/route.ts +++ b/src/app/api/openlist/cms-proxy/[token]/route.ts @@ -267,22 +267,39 @@ async function handleDetail( let videoInfo = getCachedVideoInfo(folderPath); - const listResponse = await client.listDirectory(folderPath); + // 获取所有分页的视频文件 + const allFiles: any[] = []; + let currentPage = 1; + const pageSize = 100; + let total = 0; - if (listResponse.code !== 200) { - return NextResponse.json({ - code: 0, - msg: 'OpenList 列表获取失败', - page: 1, - pagecount: 0, - limit: 0, - total: 0, - list: [], - }); + while (true) { + const listResponse = await client.listDirectory(folderPath, currentPage, pageSize); + + if (listResponse.code !== 200) { + return NextResponse.json({ + code: 0, + msg: 'OpenList 列表获取失败', + page: 1, + pagecount: 0, + limit: 0, + total: 0, + list: [], + }); + } + + total = listResponse.data.total; + allFiles.push(...listResponse.data.content); + + if (allFiles.length >= total) { + break; + } + + currentPage++; } const videoExtensions = ['.mp4', '.mkv', '.avi', '.m3u8', '.flv', '.ts', '.mov', '.wmv', '.webm', '.rmvb', '.rm', '.mpg', '.mpeg', '.3gp', '.f4v', '.m4v', '.vob']; - const videoFiles = listResponse.data.content.filter((item) => { + const videoFiles = allFiles.filter((item) => { if (item.is_dir || item.name.startsWith('.') || item.name.endsWith('.json')) return false; return videoExtensions.some(ext => item.name.toLowerCase().endsWith(ext)); }); diff --git a/src/app/api/source-detail/route.ts b/src/app/api/source-detail/route.ts index cd98192..9fc4256 100644 --- a/src/app/api/source-detail/route.ts +++ b/src/app/api/source-detail/route.ts @@ -88,14 +88,31 @@ export async function GET(request: NextRequest) { let videoInfo = getCachedVideoInfo(folderPath); - const listResponse = await client.listDirectory(folderPath); + // 获取所有分页的视频文件 + const allFiles: any[] = []; + let currentPage = 1; + const pageSize = 100; + let total = 0; - if (listResponse.code !== 200) { - throw new Error('OpenList 列表获取失败'); + while (true) { + const listResponse = await client.listDirectory(folderPath, currentPage, pageSize); + + if (listResponse.code !== 200) { + throw new Error('OpenList 列表获取失败'); + } + + total = listResponse.data.total; + allFiles.push(...listResponse.data.content); + + if (allFiles.length >= total) { + break; + } + + currentPage++; } const videoExtensions = ['.mp4', '.mkv', '.avi', '.m3u8', '.flv', '.ts', '.mov', '.wmv', '.webm', '.rmvb', '.rm', '.mpg', '.mpeg', '.3gp', '.f4v', '.m4v', '.vob']; - const videoFiles = listResponse.data.content.filter((item) => { + const videoFiles = allFiles.filter((item) => { if (item.is_dir || item.name.startsWith('.') || item.name.endsWith('.json')) return false; return videoExtensions.some(ext => item.name.toLowerCase().endsWith(ext)); });