initial commit
This commit is contained in:
44
tmdb.js
Normal file
44
tmdb.js
Normal file
@@ -0,0 +1,44 @@
|
||||
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 };
|
||||
Reference in New Issue
Block a user