import { z } from 'zod';
import { getYouTubeClient, VideoResult } from '../youtube-client.js';
export const searchVideosSchema = z.object({
query: z.string().describe('Search query for YouTube videos (e.g., "best english songs", "relaxing piano music")'),
maxResults: z.number().min(1).max(50).default(10).describe('Maximum number of results to return (1-50, default: 10)'),
});
export type SearchVideosInput = z.infer<typeof searchVideosSchema>;
export interface SearchVideosResult {
success: boolean;
videos: VideoResult[];
totalResults: number;
message: string;
}
export async function searchVideos(input: SearchVideosInput): Promise<SearchVideosResult> {
try {
const client = getYouTubeClient();
const videos = await client.searchVideos({
query: input.query,
maxResults: input.maxResults,
});
return {
success: true,
videos,
totalResults: videos.length,
message: `Found ${videos.length} videos for "${input.query}"`,
};
} catch (error) {
const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred';
return {
success: false,
videos: [],
totalResults: 0,
message: `Search failed: ${errorMessage}`,
};
}
}
export function formatSearchResults(result: SearchVideosResult): string {
if (!result.success) {
return `โ ${result.message}`;
}
if (result.videos.length === 0) {
return `No videos found for your search query.`;
}
const lines = [
`๐ต Found ${result.totalResults} videos:\n`,
];
result.videos.forEach((video, index) => {
lines.push(`${index + 1}. **${video.title}**`);
lines.push(` ๐บ Channel: ${video.channelTitle}`);
lines.push(` ๐ ID: ${video.videoId}`);
lines.push(` ๐ ${video.description.slice(0, 100)}${video.description.length > 100 ? '...' : ''}`);
lines.push('');
});
return lines.join('\n');
}