// --- CONFIGURATION & UTILITAIRES --- /** * Fonction universelle pour parler à ton RequestHandler * @param {string} action - L'action à exécuter (ex: 'searchTMDB') * @param {object} params - Les données à envoyer */ async function apiRequest(action, params = {}) { try { const response = await fetch('../RequestHandler.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ action, params }) }); return await response.json(); } catch (error) { console.error("Erreur API:", error); return { success: false, error: "Erreur de connexion au serveur" }; } } document.getElementById('ratingZone').classList.add('hidden'); // --- RECHERCHE --- /** * Lance la recherche TMDB et affiche les résultats sous forme de cartes */ async function performSearch() { const query = document.getElementById('searchInput').value; if (!query) return; const grid = document.getElementById('resultsGrid'); grid.innerHTML = '
Recherche de pépites en cours...
'; const data = await apiRequest('searchTMDB', { query: query }); grid.innerHTML = ''; // On vide if (data.results && data.results.length > 0) { data.results.forEach(item => { // On ignore les résultats sans image ou qui ne sont pas film/série if (!item.poster_path || (item.media_type !== 'movie' && item.media_type !== 'tv')) return; const title = item.title || item.name; const poster = `https://image.tmdb.org/t/p/w500${item.poster_path}`; const type = item.media_type === 'tv' ? 'serie' : 'film'; const year = (item.release_date || item.first_air_date || "").substring(0, 4); const card = document.createElement('div'); card.className = 'bg-slate-800 rounded-xl overflow-hidden border border-slate-700 hover:scale-105 transition-transform cursor-pointer group'; card.innerHTML = `Aucun résultat trouvé pour cette recherche.
'; } } // --- FICHE DÉTAILLÉE (MODAL) --- /** * Récupère les détails complets d'un film et ouvre la modal */ async function showDetails(id, type) { // TMDB utilise 'movie' ou 'tv', on s'assure d'avoir le bon type const mediaType = (type === 'serie') ? 'tv' : type; const movie = await apiRequest('getMovieDetails', { id: id, type: mediaType }); if (!movie) return; const modal = document.getElementById('movieModal'); // 1. Textes de base document.getElementById('modalTitle').innerText = movie.title || movie.name; const year = (movie.release_date || movie.first_air_date || "").substring(0, 4); const duration = movie.runtime ? `${movie.runtime} min` : (movie.number_of_seasons ? `${movie.number_of_seasons} Saison(s)` : ""); const genres = movie.genres.map(g => g.name).join(', '); document.getElementById('modalMeta').innerText = `${year} • ${genres} ${duration ? '• ' + duration : ''}`; document.getElementById('modalOverview').innerText = movie.overview || "Aucun synopsis disponible pour le moment."; document.getElementById('modalVote').innerText = movie.vote_average ? movie.vote_average.toFixed(1) : "N/A"; // 2. Images (Bannière) const bannerUrl = movie.backdrop_path ? `https://image.tmdb.org/t/p/original${movie.backdrop_path}` : ''; document.getElementById('modalBanner').style.backgroundImage = `url(${bannerUrl})`; // 3. Réalisateur const director = movie.credits.crew.find(person => person.job === 'Director'); document.getElementById('modalDirector').innerText = director ? director.name : "Non renseigné"; // 4. Casting (Les 8 premiers) const castContainer = document.getElementById('modalCast'); castContainer.innerHTML = movie.credits.cast.slice(0, 8).map(actor => `${actor.name}
${actor.character}