Actualiser api.php

This commit is contained in:
2026-10-26 10:13:23 +01:00
parent a3c5d4accc
commit 072d5475b3
+38 -7
View File
@@ -250,9 +250,30 @@ function findBestTmdbMovie($results) {
return $bestWithPoster !== null ? $bestWithPoster : $results[0]; 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 :, -, —, |) // CORRECTION : Recherche TMDB avec découpage générique des sous-titres (séparateurs universels :, -, —, |)
function fetchTmdbPosterAndSynopsis($title, $year = '', $pdo = null) { 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; if (empty($title)) return $default;
$tmdbKey = getTmdbApiKey($pdo); $tmdbKey = getTmdbApiKey($pdo);
@@ -350,11 +371,12 @@ function fetchTmdbPosterAndSynopsis($title, $year = '', $pdo = null) {
$default['title'] = $clean; $default['title'] = $clean;
// Deuxième requête pour les détails et le casting (réalisation) // 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); $detRes = httpGet($detailsUrl, 8);
if ($detRes) { if ($detRes) {
$det = json_decode($detRes, true); $det = json_decode($detRes, true);
$default['length'] = !empty($det['runtime']) ? "{$det['runtime']} min" : ''; $default['length'] = !empty($det['runtime']) ? "{$det['runtime']} min" : '';
$default['streaming'] = extractStreamingProviders($det);
if (!empty($det['credits']['crew'])) { if (!empty($det['credits']['crew'])) {
$dirs = array_filter($det['credits']['crew'], fn($c) => $c['job'] === 'Director'); $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))) : ''; $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'; $type = $data['type'] ?? 'critique';
$id = !empty($data['id']) ? $data['id'] : makeStableId($type, $data['title'] ?? '', $data['year'] ?? '0000'); $id = !empty($data['id']) ? $data['id'] : makeStableId($type, $data['title'] ?? '', $data['year'] ?? '0000');
if ($type === 'critique') { 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); $tmdbData = fetchTmdbPosterAndSynopsis($data['title'] ?? '', $data['year'] ?? '', $pdo);
if (empty($data['director'])) $data['director'] = $tmdbData['director']; if (empty($data['director'])) $data['director'] = $tmdbData['director'];
if (empty($data['poster'])) $data['poster'] = $tmdbData['poster']; 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)"; $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 = $pdo->prepare($sql);
$stmt->execute([$id, $data['title'] ?? '', $data['year'] ?? '', $data['director'] ?? '', $data['poster'] ?? '', $data['rating'] ?? 3.0, $data['review'] ?? '', $streaming]); $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++; $imported++;
} }
} else { } 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) { foreach ($items as $rowData) {
$title = $rowData['Title'] ?? $rowData['title'] ?? $rowData['Name'] ?? ''; $title = $rowData['Title'] ?? $rowData['title'] ?? $rowData['Name'] ?? '';
if (empty($title)) continue; if (empty($title)) continue;
@@ -645,15 +671,20 @@ switch ($action) {
$review = $rowData['Review'] ?? $rowData['review'] ?? $rowData['description'] ?? ''; $review = $rowData['Review'] ?? $rowData['review'] ?? $rowData['description'] ?? '';
$director = ''; $director = '';
$poster = 'assets/img/default_physical_media.jpg'; $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 // Appel TMDB intelligent avec découpage générique des sous-titres
$tmdbData = fetchTmdbPosterAndSynopsis($title, $year, $pdo); $tmdbData = fetchTmdbPosterAndSynopsis($title, $year, $pdo);
if ($tmdbData) { if ($tmdbData) {
if (!empty($tmdbData['director'])) $director = $tmdbData['director']; if (!empty($tmdbData['director'])) $director = $tmdbData['director'];
if ($tmdbData['poster'] !== 'assets/img/default_physical_media.jpg') $poster = $tmdbData['poster']; if ($tmdbData['poster'] !== 'assets/img/default_physical_media.jpg') $poster = $tmdbData['poster'];
if (empty($year) && !empty($tmdbData['year'])) $year = $tmdbData['year']; 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]); $stmtCritiques->execute([$id, $title, $year, $director, $poster, $rating, $review, $streaming]);