From 37c5fa1b48fe5c41db0f138538793b6f2b2e707b Mon Sep 17 00:00:00 2001 From: Cedric Date: Thu, 25 Jun 2026 11:49:11 +0200 Subject: [PATCH] Actualiser api.php --- api.php | 115 +++++++++++++++++++++++++++++++++----------------------- 1 file changed, 67 insertions(+), 48 deletions(-) diff --git a/api.php b/api.php index bc5a170..acde442 100644 --- a/api.php +++ b/api.php @@ -115,7 +115,7 @@ function extractYear($dateStr) { return ''; } -// ── DVDcover.com (version corrigée) ── +// ── DVDcover.com (scraping précis) ── function fetchDVDCover($title, $year = '', $format = 'bluray') { if (empty($title)) return null; @@ -124,8 +124,8 @@ function fetchDVDCover($title, $year = '', $format = 'bluray') { // Mapping des formats $formatMap = [ - '4k ultra hd' => '4k', - '4k' => '4k', + '4k ultra hd' => '4k-ultra-hd', + '4k' => '4k-ultra-hd', 'blu-ray' => 'blu-ray', 'bluray' => 'blu-ray', 'dvd' => 'dvd', @@ -133,14 +133,10 @@ function fetchDVDCover($title, $year = '', $format = 'bluray') { $dcFormat = $formatMap[strtolower($format)] ?? 'blu-ray'; - // Construction URL de recherche - $searchPath = str_replace(' ', '-', strtolower($cleanTitle)); - $searchPath = preg_replace('/[^a-z0-9-]/', '', $searchPath); - - $searchUrl = "https://www.dvdcover.com/{$dcFormat}/search/{$searchPath}"; + // URL de recherche DVDcover + $searchUrl = "https://www.dvdcover.com/?s=" . urlencode($cleanTitle); $html = httpGet($searchUrl, 8, $ua); - if (!$html) { error_log("DVDCover: Échec recherche pour '$title'"); return null; @@ -152,59 +148,82 @@ function fetchDVDCover($title, $year = '', $format = 'bluray') { 'format' => $format, ]; - // Chercher les liens vers les pages de covers individuelles - // DVDcover utilise des URLs comme /covers/title-year-format/ - if (preg_match_all('/href=["\']([^"\']*\/covers?\/[^"\']+\/[^"\']+)["\']/i', $html, $coverLinks)) { - foreach ($coverLinks[1] as $coverPage) { + // DVDcover utilise WordPress - les articles ont la classe "post" + // Chercher les liens vers les pages individuelles de covers + preg_match_all('/]*class=["\'][^"\']*post[^"\']*["\'][^>]*>.*?]+href=["\']([^"\']+)["\'][^>]*>.*?<\/article>/is', $html, $articles); + + if (!empty($articles[1])) { + // Parcourir les résultats + foreach ($articles[1] as $coverPage) { if (strpos($coverPage, 'http') !== 0) { $coverPage = 'https://www.dvdcover.com' . $coverPage; } $coverHtml = httpGet($coverPage, 8, $ua); - if ($coverHtml) { - // Chercher les images dans /wp-content/uploads/ (vraies jaquettes) - // Ignorer les images de thème (/wp-content/themes/) - if (preg_match_all('/]+src=["\']([^"\']*\/wp-content\/uploads\/[^"\']+\.jpg)["\'][^>]*>/i', $coverHtml, $imgMatches)) { - foreach ($imgMatches[1] as $img) { - // Filtrer pour ne garder que les images de covers (pas les logos, etc.) - if (strpos($img, '/covers/') !== false || - strpos($img, '/bluray/') !== false || - strpos($img, '/dvd/') !== false || - strpos($img, '/4k/') !== false) { + if (!$coverHtml) continue; + + // Méthode 1 : Chercher l'image principale dans le contenu de l'article + // DVDcover met les jaquettes dans
ou
+ if (preg_match('/]*>.*?]+src=["\']([^"\']+)["\'][^>]*>/is', $coverHtml, $m)) { + $img = $m[1]; + // Vérifier que c'est bien une jaquette (pas une image de thème) + if (strpos($img, '/wp-content/uploads/') !== false && + strpos($img, '/wp-content/themes/') === false && + (strpos($img, '.jpg') !== false || strpos($img, '.jpeg') !== false || strpos($img, '.webp') !== false)) { + $result['poster'] = $img; + } + } + + // Méthode 2 : Chercher dans entry-content + if (empty($result['poster']) && preg_match('/]*class=["\'][^"\']*entry-content[^"\']*["\'][^>]*>.*?]+src=["\']([^"\']+)["\'][^>]*>/is', $coverHtml, $m)) { + $img = $m[1]; + if (strpos($img, '/wp-content/uploads/') !== false && + strpos($img, '/wp-content/themes/') === false) { + $result['poster'] = $img; + } + } + + // Méthode 3 : Chercher toutes les images et prendre la plus grande + if (empty($result['poster'])) { + preg_match_all('/]+src=["\']([^"\']+\/wp-content\/uploads\/[^"\']+\.(?:jpg|jpeg|webp))["\'][^>]*>/i', $coverHtml, $allImages); + if (!empty($allImages[1])) { + // Prendre la première image qui n'est pas un logo ou icône + foreach ($allImages[1] as $img) { + if (strpos($img, 'logo') === false && + strpos($img, 'icon') === false && + strpos($img, 'banner') === false && + strpos($img, 'bg') === false && + strpos($img, 'button') === false) { $result['poster'] = $img; - break 2; + break; } } } - - // Fallback : chercher dans les balises meta og:image - if (empty($result['poster']) && preg_match('/]+property=["\']og:image["\'][^>]+content=["\']([^"\']+)["\']/i', $coverHtml, $m)) { - $ogImage = $m[1]; - // Vérifier que ce n'est pas une image de thème - if (strpos($ogImage, '/wp-content/uploads/') !== false) { - $result['poster'] = $ogImage; - } - } - - // Extraire le titre - if (empty($result['title']) && preg_match('/]*>([^<]+) - DVDCover/i', $coverHtml, $titleMatch)) { - $result['title'] = trim($titleMatch[1]); - } - - if (!empty($result['poster'])) { - break; - } + } + + // Extraire le titre + if (preg_match('/]*class=["\'][^"\']*entry-title[^"\']*["\'][^>]*>([^<]+)<\/h1>/i', $coverHtml, $titleMatch)) { + $result['title'] = trim(strip_tags($titleMatch[1])); + } elseif (preg_match('/]*>([^<]+)<\/title>/i', $coverHtml, $titleMatch)) { + $result['title'] = trim(strip_tags($titleMatch[1])); + } + + // Si on a trouvé une image, on arrête + if (!empty($result['poster'])) { + break; } } } - // Fallback ultime : chercher directement les images uploads dans la page de recherche + // Fallback : chercher directement dans la page de résultats if (empty($result['poster'])) { - if (preg_match_all('/]+src=["\']([^"\']*\/wp-content\/uploads\/[^"\']+\.jpg)["\'][^>]*>/i', $html, $imgMatches)) { - foreach ($imgMatches[1] as $img) { - if (strpos($img, '/covers/') !== false || - strpos($img, '/bluray/') !== false || - strpos($img, '/dvd/') !== false) { + preg_match_all('/]+src=["\']([^"\']+\/wp-content\/uploads\/[^"\']+\.(?:jpg|jpeg|webp))["\'][^>]*>/i', $html, $allImages); + if (!empty($allImages[1])) { + foreach ($allImages[1] as $img) { + if (strpos($img, 'logo') === false && + strpos($img, 'icon') === false && + strpos($img, 'banner') === false && + strpos($img, 'bg') === false) { $result['poster'] = $img; break; }