44 lines
1.6 KiB
JavaScript
44 lines
1.6 KiB
JavaScript
const axios = require('axios');
|
|
require('dotenv').config();
|
|
|
|
const API_KEY = process.env.TMDB_API_KEY;
|
|
const BASE = 'https://api.themoviedb.org/3';
|
|
let genreMap = null;
|
|
|
|
async function loadGenres() {
|
|
if (genreMap) return genreMap;
|
|
const [movieRes, tvRes] = await Promise.all([
|
|
axios.get(`${BASE}/genre/movie/list`, { params: { api_key: API_KEY } }),
|
|
axios.get(`${BASE}/genre/tv/list`, { params: { api_key: API_KEY } })
|
|
]);
|
|
genreMap = {};
|
|
(movieRes.data.genres || []).forEach(g => genreMap[g.id] = g.name);
|
|
(tvRes.data.genres || []).forEach(g => genreMap[g.id] = g.name);
|
|
return genreMap;
|
|
}
|
|
|
|
async function search(query, mediaType) {
|
|
if (!API_KEY) throw new Error('TMDB_API_KEY not set in environment');
|
|
await loadGenres();
|
|
const params = { api_key: API_KEY, query, include_adult: false, page: 1 };
|
|
let url = `${BASE}/search/multi`;
|
|
if (mediaType === 'movie' || mediaType === 'tv') url = `${BASE}/search/${mediaType}`;
|
|
const res = await axios.get(url, { params });
|
|
const results = (res.data.results || []).slice(0, 12);
|
|
return results.map(r => {
|
|
const title = r.title || r.name || r.original_title || r.original_name || '';
|
|
const overview = r.overview || '';
|
|
const genreIds = r.genre_ids || (r.genres ? r.genres.map(g => g.id) : []);
|
|
const genres = genreIds.map(id => genreMap[id]).filter(Boolean);
|
|
return {
|
|
id: r.id,
|
|
title,
|
|
type: r.media_type || (r.title ? 'movie' : 'tv'),
|
|
overview,
|
|
genres,
|
|
poster: r.poster_path ? `https://image.tmdb.org/t/p/w342${r.poster_path}` : null
|
|
};
|
|
});
|
|
}
|
|
|
|
module.exports = { search }; |