Actualiser api.php

This commit is contained in:
2026-06-25 15:42:21 +02:00
parent 0efc35bcf7
commit 1f0fce2c4d
+47 -30
View File
@@ -121,7 +121,6 @@ function fetchDVDCover($title, $year = '', $format = 'bluray') {
if (empty($cleanTitle)) return null; if (empty($cleanTitle)) return null;
// API REST WordPress de DVDcover // API REST WordPress de DVDcover
// Endpoint : /wp-json/wp/v2/posts?search=TITRE&_embed
$searchUrl = "https://www.dvdcover.com/wp-json/wp/v2/posts?search=" . urlencode($cleanTitle) . "&_embed&per_page=10"; $searchUrl = "https://www.dvdcover.com/wp-json/wp/v2/posts?search=" . urlencode($cleanTitle) . "&_embed&per_page=10";
$json = httpGet($searchUrl, 10); $json = httpGet($searchUrl, 10);
@@ -140,31 +139,22 @@ function fetchDVDCover($title, $year = '', $format = 'bluray') {
$bestPost = null; $bestPost = null;
$bestScore = 0; $bestScore = 0;
// Parcourir les posts et scorer leur pertinence
foreach ($posts as $post) { foreach ($posts as $post) {
$postTitle = $post['title']['rendered'] ?? ''; $postTitle = $post['title']['rendered'] ?? '';
$postTitleLower = strtolower($postTitle); $postTitleLower = strtolower($postTitle);
$score = 0; $score = 0;
// Le titre du post contient-il le film recherché ?
if (strpos($postTitleLower, $cleanTitleLower) !== false) { if (strpos($postTitleLower, $cleanTitleLower) !== false) {
$score += 50; $score += 50;
} }
// Correspondance de l'année
if (!empty($year) && strpos($postTitle, $year) !== false) { if (!empty($year) && strpos($postTitle, $year) !== false) {
$score += 30; $score += 30;
} }
// Correspondance du format
$formatLower = strtolower($format); $formatLower = strtolower($format);
if (stripos($postTitle, $format) !== false || if (stripos($postTitle, $format) !== false ||
stripos($postTitle, str_replace('-', ' ', $format)) !== false) { stripos($postTitle, str_replace('-', ' ', $format)) !== false) {
$score += 20; $score += 20;
} }
// Bonus si le titre contient "cover" ou "jaquette"
if (stripos($postTitle, 'cover') !== false) { if (stripos($postTitle, 'cover') !== false) {
$score += 10; $score += 10;
} }
@@ -173,12 +163,9 @@ function fetchDVDCover($title, $year = '', $format = 'bluray') {
$bestScore = $score; $bestScore = $score;
$bestPost = $post; $bestPost = $post;
} }
// Score parfait, on arrête
if ($score >= 100) break; if ($score >= 100) break;
} }
// Si aucun post ne correspond assez bien, prendre le premier
if (!$bestPost && !empty($posts)) { if (!$bestPost && !empty($posts)) {
$bestPost = $posts[0]; $bestPost = $posts[0];
} }
@@ -191,10 +178,8 @@ function fetchDVDCover($title, $year = '', $format = 'bluray') {
// Méthode 1 : Image mise en avant (_embedded.wp:featuredmedia) // Méthode 1 : Image mise en avant (_embedded.wp:featuredmedia)
if (isset($bestPost['_embedded']['wp:featuredmedia'][0])) { if (isset($bestPost['_embedded']['wp:featuredmedia'][0])) {
$featured = $bestPost['_embedded']['wp:featuredmedia'][0]; $featured = $bestPost['_embedded']['wp:featuredmedia'][0];
// Chercher la plus grande taille disponible
if (!empty($featured['media_details']['sizes'])) { if (!empty($featured['media_details']['sizes'])) {
$sizes = $featured['media_details']['sizes']; $sizes = $featured['media_details']['sizes'];
// Ordre de préférence : full > large > medium > thumbnail
$preferredSizes = ['full', 'large', 'medium', 'thumbnail']; $preferredSizes = ['full', 'large', 'medium', 'thumbnail'];
foreach ($preferredSizes as $size) { foreach ($preferredSizes as $size) {
if (isset($sizes[$size]['source_url'])) { if (isset($sizes[$size]['source_url'])) {
@@ -203,7 +188,6 @@ function fetchDVDCover($title, $year = '', $format = 'bluray') {
} }
} }
} }
// Fallback : source_url direct
if (empty($poster) && !empty($featured['source_url'])) { if (empty($poster) && !empty($featured['source_url'])) {
$poster = $featured['source_url']; $poster = $featured['source_url'];
} }
@@ -212,10 +196,8 @@ function fetchDVDCover($title, $year = '', $format = 'bluray') {
// Méthode 2 : Images dans le contenu du post // Méthode 2 : Images dans le contenu du post
if (empty($poster) && !empty($bestPost['content']['rendered'])) { if (empty($poster) && !empty($bestPost['content']['rendered'])) {
$content = $bestPost['content']['rendered']; $content = $bestPost['content']['rendered'];
// Chercher les balises img
if (preg_match_all('/<img[^>]+src=["\']([^"\']+)["\'][^>]*>/i', $content, $matches)) { if (preg_match_all('/<img[^>]+src=["\']([^"\']+)["\'][^>]*>/i', $content, $matches)) {
foreach ($matches[1] as $img) { foreach ($matches[1] as $img) {
// Filtrer les images non pertinentes
if (strpos($img, 'logo') === false && if (strpos($img, 'logo') === false &&
strpos($img, 'icon') === false && strpos($img, 'icon') === false &&
strpos($img, 'banner') === false && strpos($img, 'banner') === false &&
@@ -230,16 +212,6 @@ function fetchDVDCover($title, $year = '', $format = 'bluray') {
} }
} }
// Méthode 3 : Images embarquées dans _embedded.wp:embedded
if (empty($poster) && isset($bestPost['_embedded']['wp:embedded'])) {
foreach ($bestPost['_embedded']['wp:embedded'] as $embedded) {
if (!empty($embedded['source_url'])) {
$poster = $embedded['source_url'];
break;
}
}
}
if (empty($poster)) { if (empty($poster)) {
error_log("DVDCover API: Pas d'image trouvée pour le post ID " . ($bestPost['id'] ?? '?')); error_log("DVDCover API: Pas d'image trouvée pour le post ID " . ($bestPost['id'] ?? '?'));
return null; return null;
@@ -250,10 +222,30 @@ function fetchDVDCover($title, $year = '', $format = 'bluray') {
$poster = 'https://www.dvdcover.com' . (strpos($poster, '/') === 0 ? '' : '/') . ltrim($poster, '/'); $poster = 'https://www.dvdcover.com' . (strpos($poster, '/') === 0 ? '' : '/') . ltrim($poster, '/');
} }
// Supprimer les suffixes de taille WordPress pour avoir la version originale // Supprimer les suffixes de taille WordPress
// Ex: image-300x200.jpg → image.jpg
$poster = preg_replace('/-\d+x\d+(\.\w+)$/', '$1', $poster); $poster = preg_replace('/-\d+x\d+(\.\w+)$/', '$1', $poster);
// VÉRIFICATION : Tester si l'image est accessible
// Essayer différentes variantes d'URL
$urlVariants = [
$poster,
str_replace('dvdcover.com', 'www.dvdcover.com', $poster),
str_replace('https://www.dvdcover.com', 'https://dvdcover.com', $poster),
];
foreach ($urlVariants as $testUrl) {
if (urlExists($testUrl, 3)) {
error_log("DVDCover API: Image valide trouvée - $testUrl");
return [
'poster' => $testUrl,
'title' => $bestPost['title']['rendered'] ?? $cleanTitle,
'format' => $format,
];
}
}
// Si aucune URL ne fonctionne, retourner quand même la première (peut-être un problème temporaire)
error_log("DVDCover API: Aucune URL d'image valide trouvée, retour de la première URL");
return [ return [
'poster' => $poster, 'poster' => $poster,
'title' => $bestPost['title']['rendered'] ?? $cleanTitle, 'title' => $bestPost['title']['rendered'] ?? $cleanTitle,
@@ -261,6 +253,31 @@ function fetchDVDCover($title, $year = '', $format = 'bluray') {
]; ];
} }
// Fonction pour vérifier si une URL existe
function urlExists($url, $timeout = 3) {
if (!function_exists('curl_init')) {
$ctx = stream_context_create(['http' => ['timeout' => $timeout, 'method' => 'HEAD']]);
$result = @get_headers($url, 0, $ctx);
return ($result && strpos($result[0], '200') !== false);
}
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_NOBODY => true,
CURLOPT_TIMEOUT => $timeout,
CURLOPT_CONNECTTIMEOUT => 2,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
CURLOPT_FOLLOWLOCATION => true,
]);
curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
return ($code >= 200 && $code < 400);
}
// ── API TMDB (uniquement pour les critiques) ── // ── API TMDB (uniquement pour les critiques) ──
function fetchTMDBFull($title, $year, $apiKey, $pdo) { function fetchTMDBFull($title, $year, $apiKey, $pdo) {
if (empty($apiKey) || empty($title)) return null; if (empty($apiKey) || empty($title)) return null;