diff --git a/src/app/api/douban-recommendations/route.ts b/src/app/api/douban-recommendations/route.ts index 2ae448f..caa5cf7 100644 --- a/src/app/api/douban-recommendations/route.ts +++ b/src/app/api/douban-recommendations/route.ts @@ -1,5 +1,6 @@ import { NextRequest, NextResponse } from 'next/server'; import * as cheerio from 'cheerio'; +import { fetchDoubanData } from '@/lib/douban'; export const runtime = 'nodejs'; @@ -10,6 +11,12 @@ interface DoubanRecommendation { rating: string; } +interface DoubanDetailApiResponse { + id: string; + title: string; + [key: string]: any; +} + export async function GET(request: NextRequest) { const { searchParams } = new URL(request.url); const doubanId = searchParams.get('id'); @@ -84,9 +91,44 @@ export async function GET(request: NextRequest) { console.log('解析到推荐数:', recommendations.length); + // 处理标题截断问题 + const processedRecommendations: DoubanRecommendation[] = []; + + for (const rec of recommendations) { + // 检查标题是否被截断(包含三个点) + if (rec.title.includes('...')) { + console.log(`检测到截断标题: ${rec.title}, ID: ${rec.doubanId}`); + + try { + // 调用豆瓣详情接口获取完整名称 + const detailUrl = `https://m.douban.com/rexxar/api/v2/subject/${rec.doubanId}`; + const detailData = await fetchDoubanData(detailUrl); + + if (detailData && detailData.title) { + console.log(`成功获取完整标题: ${detailData.title}`); + processedRecommendations.push({ + ...rec, + title: detailData.title, + }); + } else { + console.log(`详情接口未返回标题,移除该视频: ${rec.doubanId}`); + // 补充失败,不添加到结果中 + } + } catch (error) { + console.error(`获取完整标题失败,移除该视频: ${rec.doubanId}`, error); + // 补充失败,不添加到结果中 + } + } else { + // 标题正常,直接添加 + processedRecommendations.push(rec); + } + } + + console.log('处理后的推荐数:', processedRecommendations.length); + return NextResponse.json( { - recommendations, + recommendations: processedRecommendations, }, { headers: {