diff --git a/src/app/api/source-detail/route.ts b/src/app/api/source-detail/route.ts index ab2e239..6f019ce 100644 --- a/src/app/api/source-detail/route.ts +++ b/src/app/api/source-detail/route.ts @@ -207,6 +207,8 @@ export async function GET(request: NextRequest) { proxyMode: false, // 返回用户点击的文件索引(如果找到的话) initialEpisodeIndex: clickedFileIndex >= 0 ? clickedFileIndex : undefined, + // 返回元数据来源 + metadataSource: metadata.source, }; return NextResponse.json(result); diff --git a/src/app/play/page.tsx b/src/app/play/page.tsx index ed06198..ff53d67 100644 --- a/src/app/play/page.tsx +++ b/src/app/play/page.tsx @@ -2677,8 +2677,10 @@ function PlayPageClient() { newUrl.searchParams.set('year', detailData.year); // 保持原有的 title,不更新 newUrl.searchParams.delete('prefer'); - // 删除fileName参数,避免换集后刷新跳回到最初点击的那一集 - newUrl.searchParams.delete('fileName'); + // 只有当元数据不是从文件获取时,才删除fileName参数 + if (detailData.metadataSource !== 'file') { + newUrl.searchParams.delete('fileName'); + } window.history.replaceState({}, '', newUrl.toString()); setLoadingStage('ready'); diff --git a/src/lib/types.ts b/src/lib/types.ts index 740480c..a9a6026 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -140,6 +140,7 @@ export interface SearchResult { tmdb_id?: number; // TMDB ID rating?: number; // 评分 initialEpisodeIndex?: number; // 初始集数索引(用于小雅源从文件点击进入时指定集数) + metadataSource?: 'folder' | 'nfo' | 'tmdb' | 'file'; // 元数据来源(用于小雅源判断是否保留fileName) } // 豆瓣数据结构 diff --git a/src/lib/xiaoya-metadata.ts b/src/lib/xiaoya-metadata.ts index fdfba96..eb31ffd 100644 --- a/src/lib/xiaoya-metadata.ts +++ b/src/lib/xiaoya-metadata.ts @@ -14,7 +14,7 @@ export interface XiaoyaMetadata { poster?: string; background?: string; mediaType: 'movie' | 'tv'; - source: 'folder' | 'nfo' | 'tmdb'; + source: 'folder' | 'nfo' | 'tmdb' | 'file'; } /** @@ -48,18 +48,32 @@ async function findNFO( videoPath: string ): Promise { const pathParts = videoPath.split('/').filter(Boolean); - const parentDir = pathParts.slice(0, -1).join('/'); - const isInSeasonDir = /(season\s*\d+|s\d+)/i.test(parentDir); + // 判断是否为文件路径 + const videoExtensions = ['.mp4', '.mkv', '.avi', '.m3u8', '.flv', '.ts', '.mov', '.wmv', '.webm']; + const isFilePath = videoExtensions.some(ext => videoPath.toLowerCase().endsWith(ext)); + + let isInSeasonDir = false; + + if (isFilePath) { + // 文件路径:判断父目录是否为季度目录 + const parentDir = pathParts[pathParts.length - 2]; + isInSeasonDir = /(season\s*\d+|s\d+)/i.test(parentDir); + } else { + // 目录路径:判断当前目录是否为季度目录 + const currentDir = pathParts[pathParts.length - 1]; + isInSeasonDir = /(season\s*\d+|s\d+)/i.test(currentDir); + } const nfoSearchPaths: string[] = []; if (isInSeasonDir) { // 电视剧:查父级的 tvshow.nfo - const grandParentDir = pathParts.slice(0, -2).join('/'); + const grandParentDir = pathParts.slice(0, isFilePath ? -2 : -1).join('/'); nfoSearchPaths.push(`/${grandParentDir}/tvshow.nfo`); } else { // 电影:查同级的 movie.nfo + const parentDir = pathParts.slice(0, isFilePath ? -1 : pathParts.length).join('/'); nfoSearchPaths.push(`/${parentDir}/movie.nfo`); } @@ -123,8 +137,18 @@ export async function getXiaoyaMetadata( metadataDir = ''; folderName = pathParts[0]; } else { - metadataDir = pathParts.slice(0, -1).join('/'); - folderName = pathParts[pathParts.length - 1]; + // 判断当前目录是否为季度目录 + const currentDirName = pathParts[pathParts.length - 1]; + const isSeasonDir = /(season\s*\d+|s\d+)/i.test(currentDirName); + + if (isSeasonDir && pathParts.length >= 2) { + // 季度目录:使用父级目录名 + metadataDir = pathParts.slice(0, -2).join('/'); + folderName = pathParts[pathParts.length - 2]; + } else { + metadataDir = pathParts.slice(0, -1).join('/'); + folderName = pathParts[pathParts.length - 1]; + } } } @@ -153,7 +177,7 @@ export async function getXiaoyaMetadata( poster: posterUrl, background: backgroundUrl, mediaType: isInSeasonDir ? 'tv' : 'movie', - source: nfoData ? 'nfo' : 'folder', + source: nfoData ? 'nfo' : (isFilePath ? 'file' : 'folder'), }; } @@ -206,7 +230,7 @@ export async function getXiaoyaMetadata( ? getTMDBImageUrl(tmdbResult.result.poster_path) : undefined, mediaType: tmdbResult.result.media_type, - source: 'tmdb', + source: isFilePath ? 'file' : 'tmdb', }; } }