Actualiser api.php
This commit is contained in:
@@ -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]);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user