Files
What-to-watch/tmdb.js
2026-02-09 11:24:43 +01:00

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 };