tv-recommender-mcp-server
Version:
MCP server for TV show recommendations
131 lines (130 loc) • 5.33 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getRecommendationsByGenre = getRecommendationsByGenre;
exports.getSimilarShows = getSimilarShows;
const tmdbClient_1 = require("../services/tmdbClient");
const genreMap_1 = require("../utils/genreMap");
const errorHandler_1 = require("../utils/errorHandler");
/**
* 从TMDb API响应中提取需要的信息并格式化
* @param results TMDb API返回的剧集列表
* @returns 格式化后的剧集推荐列表
*/
function formatShowResults(results) {
return results.map(show => {
// 从首播日期中提取年份
const year = show.first_air_date ?
new Date(show.first_air_date).getFullYear() :
null;
return {
title: show.name,
year: year || 0, // 如果没有年份,用0表示未知
rating: show.vote_average || 0,
overview: show.overview || '暂无简介'
};
});
}
/**
* 将推荐结果格式化为字符串
* @param genre 查询的类型
* @param recommendations 推荐结果列表
* @returns 格式化的字符串
*/
function formatRecommendationsToString(genre, recommendations) {
if (!recommendations || recommendations.length === 0) {
return `抱歉,在"${genre}"类型下没有找到推荐剧集。`;
}
// 格式化头部
let result = `根据您选择的${genre},为您推荐以下剧集:\n`;
// 格式化每个推荐
recommendations.forEach((show, index) => {
result += `${index + 1}. ${show.title} (${show.year}): ${show.rating.toFixed(1)} - ${show.overview}\n`;
});
return result;
}
/**
* 将相似剧集结果格式化为字符串
* @param originalTitle 原始剧集名称
* @param recommendations 推荐结果列表
* @returns 格式化的字符串
*/
function formatSimilarShowsToString(originalTitle, recommendations) {
if (!recommendations || recommendations.length === 0) {
return `抱歉,未能找到与"${originalTitle}"相似的剧集。`;
}
// 格式化头部
let result = `与 ${originalTitle} 相似的剧集推荐:\n`;
// 格式化每个推荐
recommendations.forEach((show, index) => {
result += `${index + 1}. ${show.title} (${show.year}): ${show.rating.toFixed(1)} - ${show.overview}\n`;
});
return result;
}
/**
* 按类型获取剧集推荐实现
* @param params 参数对象,包含genre字段
* @returns 推荐结果字符串
*/
async function getRecommendationsByGenre(params) {
try {
// 检查参数
if (!params.genre) {
throw new errorHandler_1.ApiError('缺少必要参数:genre', 400);
}
// 将用户输入的类型映射到TMDb类型ID
const genreId = (0, genreMap_1.mapGenreToId)(params.genre);
// 如果无法识别类型
if (!genreId) {
return `抱歉,无法识别您提供的类型"${params.genre}",请尝试其他类型如"喜剧"、"科幻"等。`;
}
// 获取类型名称(使用中文)
const genreName = (0, genreMap_1.getGenreNameById)(genreId) || params.genre;
// 调用TMDb API获取推荐
const response = await tmdbClient_1.tmdbClient.getRecommendationsByGenre(genreId);
// 格式化结果
const recommendations = formatShowResults(response.results);
// 返回格式化的字符串
return formatRecommendationsToString(genreName, recommendations);
}
catch (error) {
// console.error('获取推荐时发生错误:', error);
return `获取推荐时发生错误: ${(0, errorHandler_1.formatErrorMessage)(error)}`;
}
}
/**
* 获取相似剧集推荐实现
* @param params 参数对象,包含show_title字段
* @returns 推荐结果字符串
*/
async function getSimilarShows(params) {
try {
// 检查参数
if (!params.show_title) {
throw new errorHandler_1.ApiError('缺少必要参数:show_title', 400);
}
// 第一步:根据剧名搜索剧集
const searchResponse = await tmdbClient_1.tmdbClient.searchTvShowByTitle(params.show_title);
// 检查是否找到结果
if (!searchResponse.results || searchResponse.results.length === 0) {
return `抱歉,未能找到您提供的剧集"${params.show_title}"。`;
}
// 获取第一个搜索结果(最匹配的)
const firstResult = searchResponse.results[0];
const showId = firstResult.id;
const showTitle = firstResult.name;
// 第二步:获取相似剧集
const similarResponse = await tmdbClient_1.tmdbClient.getSimilarTvShows(showId);
// 检查是否有相似剧集
if (!similarResponse.results || similarResponse.results.length === 0) {
return `抱歉,未能找到与"${showTitle}"相似的剧集。`;
}
// 格式化结果
const recommendations = formatShowResults(similarResponse.results);
// 返回格式化的字符串
return formatSimilarShowsToString(showTitle, recommendations);
}
catch (error) {
// console.error('获取相似剧集时发生错误:', error);
return `获取相似剧集时发生错误: ${(0, errorHandler_1.formatErrorMessage)(error)}`;
}
}