diff --git a/api.php b/api.php index 9e4f32c..13aa0c1 100644 --- a/api.php +++ b/api.php @@ -250,9 +250,30 @@ function findBestTmdbMovie($results) { return $bestWithPoster !== null ? $bestWithPoster : $results[0]; } +// Valeur affichée quand aucune plateforme de streaming n'est disponible +define('DEFAULT_STREAMING', 'Support physique / Cinéma'); + +// Extrait les plateformes de visionnage (abonnement / gratuit / avec pub) pour la France +// à partir de la réponse TMDB "watch/providers". Renvoie '' si aucune plateforme. +function extractStreamingProviders($det, $region = 'FR') { + $block = $det['watch/providers']['results'][$region] ?? null; + if (!is_array($block)) return ''; + $names = []; + foreach (['flatrate', 'free', 'ads'] as $kind) { + foreach (($block[$kind] ?? []) as $p) { + $name = trim($p['provider_name'] ?? ''); + if ($name === '') continue; + // Uniformise les variantes "avec publicité" d'une même plateforme + $name = trim(preg_replace('/\s+(Standard )?with Ads$/i', '', $name)); + if ($name !== '' && !in_array($name, $names, true)) $names[] = $name; + } + } + return implode(', ', array_slice($names, 0, 6)); +} + // CORRECTION : Recherche TMDB avec découpage générique des sous-titres (séparateurs universels :, -, —, |) function fetchTmdbPosterAndSynopsis($title, $year = '', $pdo = null) { - $default = ['poster'=>'assets/img/default_physical_media.jpg','title'=>'','description'=>'','director'=>'','actors'=>'','length'=>'','year'=>'']; + $default = ['poster'=>'assets/img/default_physical_media.jpg','title'=>'','description'=>'','director'=>'','actors'=>'','length'=>'','year'=>'','streaming'=>'']; if (empty($title)) return $default; $tmdbKey = getTmdbApiKey($pdo); @@ -350,11 +371,12 @@ function fetchTmdbPosterAndSynopsis($title, $year = '', $pdo = null) { $default['title'] = $clean; // Deuxième requête pour les détails et le casting (réalisation) - $detailsUrl = "https://api.themoviedb.org/3/movie/{$movieId}?api_key={$tmdbKey}&append_to_response=credits&language=fr-FR"; + $detailsUrl = "https://api.themoviedb.org/3/movie/{$movieId}?api_key={$tmdbKey}&append_to_response=credits,watch/providers&language=fr-FR"; $detRes = httpGet($detailsUrl, 8); if ($detRes) { $det = json_decode($detRes, true); $default['length'] = !empty($det['runtime']) ? "{$det['runtime']} min" : ''; + $default['streaming'] = extractStreamingProviders($det); if (!empty($det['credits']['crew'])) { $dirs = array_filter($det['credits']['crew'], fn($c) => $c['job'] === 'Director'); $default['director'] = $dirs ? implode(', ', array_map(fn($c) => $c['name'], array_slice($dirs, 0, 2))) : ''; @@ -510,12 +532,14 @@ switch ($action) { $type = $data['type'] ?? 'critique'; $id = !empty($data['id']) ? $data['id'] : makeStableId($type, $data['title'] ?? '', $data['year'] ?? '0000'); if ($type === 'critique') { - if (empty($data['director']) || empty($data['poster'])) { + $streaming = trim($data['streaming'] ?? ''); + if (empty($data['director']) || empty($data['poster']) || $streaming === '') { $tmdbData = fetchTmdbPosterAndSynopsis($data['title'] ?? '', $data['year'] ?? '', $pdo); if (empty($data['director'])) $data['director'] = $tmdbData['director']; if (empty($data['poster'])) $data['poster'] = $tmdbData['poster']; + if ($streaming === '') $streaming = $tmdbData['streaming'] ?? ''; } - $streaming = $data['streaming'] ?? 'Support physique / Cinéma'; + if ($streaming === '') $streaming = DEFAULT_STREAMING; $sql = "INSERT INTO critiques (id, title, year, director, poster, rating, review, streaming) VALUES (?, ?, ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE title=VALUES(title), year=VALUES(year), director=VALUES(director), poster=VALUES(poster), rating=VALUES(rating), review=VALUES(review), streaming=VALUES(streaming)"; $stmt = $pdo->prepare($sql); $stmt->execute([$id, $data['title'] ?? '', $data['year'] ?? '', $data['director'] ?? '', $data['poster'] ?? '', $data['rating'] ?? 3.0, $data['review'] ?? '', $streaming]); @@ -629,7 +653,9 @@ switch ($action) { $imported++; } } else { - $stmtCritiques = $pdo->prepare("INSERT INTO critiques (id, title, year, director, poster, rating, review, streaming) VALUES (?, ?, ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE title=VALUES(title), year=VALUES(year), director=VALUES(director), poster=VALUES(poster), rating=VALUES(rating), review=VALUES(review), streaming=VALUES(streaming)"); + // Un ré-import (ex: ratings.csv après reviews.csv) ne doit pas écraser les données déjà présentes + // par des valeurs vides ou par défaut : on ne remplace que si la nouvelle valeur est renseignée. + $stmtCritiques = $pdo->prepare("INSERT INTO critiques (id, title, year, director, poster, rating, review, streaming) VALUES (?, ?, ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE title=VALUES(title), year=VALUES(year), director=IF(VALUES(director)!='', VALUES(director), director), poster=IF(VALUES(poster)!='assets/img/default_physical_media.jpg', VALUES(poster), poster), rating=IF(VALUES(rating) IS NOT NULL, VALUES(rating), rating), review=IF(VALUES(review)!='', VALUES(review), review), streaming=IF(VALUES(streaming)!='" . DEFAULT_STREAMING . "', VALUES(streaming), streaming)"); foreach ($items as $rowData) { $title = $rowData['Title'] ?? $rowData['title'] ?? $rowData['Name'] ?? ''; if (empty($title)) continue; @@ -645,15 +671,20 @@ switch ($action) { $review = $rowData['Review'] ?? $rowData['review'] ?? $rowData['description'] ?? ''; $director = ''; $poster = 'assets/img/default_physical_media.jpg'; - $streaming = 'Support physique / Cinéma'; - + // Plateforme éventuellement fournie dans le CSV (colonne "Streaming" ou "Plateforme") + $streaming = trim($rowData['Streaming'] ?? $rowData['streaming'] ?? $rowData['Plateforme'] ?? $rowData['plateforme'] ?? ''); + // Appel TMDB intelligent avec découpage générique des sous-titres $tmdbData = fetchTmdbPosterAndSynopsis($title, $year, $pdo); if ($tmdbData) { if (!empty($tmdbData['director'])) $director = $tmdbData['director']; if ($tmdbData['poster'] !== 'assets/img/default_physical_media.jpg') $poster = $tmdbData['poster']; if (empty($year) && !empty($tmdbData['year'])) $year = $tmdbData['year']; + // Plateformes de streaming disponibles en France d'après TMDB + if ($streaming === '' && !empty($tmdbData['streaming'])) $streaming = $tmdbData['streaming']; } + // Aucune plateforme trouvée : support physique / cinéma + if ($streaming === '') $streaming = DEFAULT_STREAMING; $stmtCritiques->execute([$id, $title, $year, $director, $poster, $rating, $review, $streaming]);