diff --git a/api.php b/api.php index 24bde60..dfdcbc8 100644 --- a/api.php +++ b/api.php @@ -158,69 +158,55 @@ function fetchCinemaPassion($title, $year = '', $ean = '', $pdo = null) { error_log("CinemaPassion: ✅ Recherche OK, " . strlen($searchRes) . " caractères reçus"); - // ÉTAPE 2 : Extraire TOUS les liens vers des films (pattern plus flexible) + // ÉTAPE 2 : Trouver TOUS les liens vers des films et chercher une correspondance EXACTE $filmUrl = null; $filmName = null; $filmId = null; $bestMatch = null; $bestMatchScore = 0; - // Pattern flexible : cherche film/XXX-NNN.php avec ou sans balises HTML autour - if (preg_match_all('/film\/([A-Za-z0-9\-]+)-(\d+)\.php/i', $searchRes, $allMatches, PREG_SET_ORDER)) { + // Pattern pour extraire tous les films avec leurs titres affichés + if (preg_match_all('/]+)-(\d+)\.php["\']?[^>]*>([^<]+)<\/a>/i', $searchRes, $allMatches, PREG_SET_ORDER)) { error_log("CinemaPassion: " . count($allMatches) . " liens de films trouvés"); - // Dédupliquer les résultats - $uniqueFilms = []; foreach ($allMatches as $match) { - $key = $match[1] . '-' . $match[2]; - if (!isset($uniqueFilms[$key])) { - $uniqueFilms[$key] = [ - 'name' => $match[1], - 'id' => $match[2] - ]; - } - } - - foreach ($uniqueFilms as $film) { - $linkName = $film['name']; - $linkId = $film['id']; + $linkName = $match[1]; + $linkId = $match[2]; + $linkTitle = trim($match[3]); - // Nettoyer le nom pour comparaison - $linkNameClean = str_replace(['-', '_'], ' ', $linkName); - $linkNameClean = preg_replace('/\s+/', ' ', trim($linkNameClean)); + // Nettoyer le titre du lien pour comparaison + $linkTitleClean = cleanTitle($linkTitle); + $linkNameClean = str_replace('-', ' ', $linkName); // Calculer un score de correspondance $score = 0; - // Correspondance exacte - if (strcasecmp($linkNameClean, $cleanTitle) === 0) { + // Correspondance exacte (titre ou nom URL) + if (strcasecmp($linkTitleClean, $cleanTitle) === 0) { $score = 100; - error_log("CinemaPassion: ✅✅✅ CORRESPONDANCE EXACTE: '{$linkName}'"); + error_log("CinemaPassion: ✅✅✅ CORRESPONDANCE EXACTE (titre): '{$linkTitle}'"); + } elseif (strcasecmp($linkNameClean, $cleanTitle) === 0) { + $score = 90; + error_log("CinemaPassion: ✅✅ CORRESPONDANCE EXACTE (URL): '{$linkName}'"); } - // Le nom contient le titre recherché - elseif (stripos($linkNameClean, $cleanTitle) !== false) { - $score = 80; - error_log("CinemaPassion: ✅ Correspondance forte: '{$linkName}' contient '{$cleanTitle}'"); - } - // Le titre recherché contient le nom - elseif (stripos($cleanTitle, $linkNameClean) !== false) { + // Correspondance partielle forte (le titre recherché est contenu dans le lien) + elseif (stripos($linkTitleClean, $cleanTitle) === 0 || stripos($linkNameClean, $cleanTitle) === 0) { $score = 70; - error_log("CinemaPassion: ✅ Correspondance: '{$cleanTitle}' contient '{$linkName}'"); + error_log("CinemaPassion: ✅ Correspondance début: '{$linkTitle}' contient '{$cleanTitle}'"); } - // Similarité partielle - else { - similar_text(strtolower($linkNameClean), strtolower($cleanTitle), $percent); - if ($percent > 60) { - $score = 60; - error_log("CinemaPassion: ⚠️ Similarité {$percent}%: '{$linkName}' vs '{$cleanTitle}'"); - } + // Correspondance partielle faible + elseif (stripos($linkTitleClean, $cleanTitle) !== false || stripos($linkNameClean, $cleanTitle) !== false) { + $score = 50; + error_log("CinemaPassion: ⚠️ Correspondance partielle: '{$linkTitle}' contient '{$cleanTitle}'"); } + // Si on a trouvé une meilleure correspondance, on la garde if ($score > $bestMatchScore) { $bestMatchScore = $score; $bestMatch = [ 'name' => $linkName, 'id' => $linkId, + 'title' => $linkTitle, 'score' => $score ]; } @@ -233,11 +219,14 @@ function fetchCinemaPassion($title, $year = '', $ean = '', $pdo = null) { $filmId = $bestMatch['id']; error_log("CinemaPassion: ✅ Meilleur match sélectionné (score: {$bestMatch['score']}): {$filmName}-{$filmId}"); } else { - error_log("CinemaPassion: ❌ Aucune correspondance suffisante (meilleur score: " . ($bestMatch['score'] ?? 0) . ")"); - return ['poster' => $defaultPoster, 'title' => $cleanTitle, 'format' => 'Blu-ray']; + error_log("CinemaPassion: ❌ Aucune correspondance suffisante trouvée (meilleur score: " . ($bestMatch['score'] ?? 0) . ")"); } } else { error_log("CinemaPassion: ❌ Aucun lien de film trouvé dans les résultats"); + } + + if (!$filmUrl) { + error_log("CinemaPassion: ❌ Film non trouvé pour '{$cleanTitle}'"); return ['poster' => $defaultPoster, 'title' => $cleanTitle, 'format' => 'Blu-ray']; } @@ -252,19 +241,19 @@ function fetchCinemaPassion($title, $year = '', $ean = '', $pdo = null) { error_log("CinemaPassion: ✅ Page film OK, " . strlen($filmPageRes) . " caractères reçus"); - // ÉTAPE 4 : Chercher le lien vers la jaquette DVD ou Blu-ray (pattern flexible) + // ÉTAPE 4 : Chercher le lien vers la jaquette DVD ou Blu-ray $jaquetteUrl = null; - if (preg_match('/jaquette-(?:dvd|blu-ray)-[A-Za-z0-9\-]+-\d+\.php/i', $filmPageRes, $matches)) { - $jaquettePath = $matches[0]; - $jaquettePath = str_replace('../', '', $jaquettePath); + // Pattern pour trouver le chemin de la jaquette + if (preg_match('/href=["\']?(?:\.\.\/)?(jaquette-(?:dvd|blu-ray)-[^"\'\s<>]+\.php)["\']?/i', $filmPageRes, $matches)) { + $jaquettePath = $matches[1]; $jaquetteUrl = "https://www.cinemapassion.com/" . $jaquettePath; error_log("CinemaPassion: ✅ Page jaquette trouvée: {$jaquetteUrl}"); } else { error_log("CinemaPassion: ⚠️ Aucun lien de jaquette trouvé dans la page film"); } - // ÉTAPE 5 : Si page jaquette trouvée, aller dessus et extraire l'image + // ÉTAPE 5 : Si page jaquette trouvée, aller dessus et extraire l'image covers_temp if ($jaquetteUrl) { error_log("CinemaPassion: Accès à la page jaquette: {$jaquetteUrl}"); $jaquettePageRes = httpGet($jaquetteUrl, 10); @@ -272,21 +261,12 @@ function fetchCinemaPassion($title, $year = '', $ean = '', $pdo = null) { if ($jaquettePageRes) { error_log("CinemaPassion: ✅ Page jaquette OK, " . strlen($jaquettePageRes) . " caractères reçus"); - // Pattern flexible pour covers_temp - if (preg_match('/covers_temp\/covers\d*\/[A-Za-z0-9\-_]+\.jpg/i', $jaquettePageRes, $imgMatches)) { - $posterUrl = $imgMatches[0]; - if (strpos($posterUrl, 'http') !== 0) { - $posterUrl = 'https://www.cinemapassion.com/' . ltrim($posterUrl, '/'); - } + // ✅ CORRECTION : Chercher l'URL COMPLÈTE dans src (pas juste le chemin) + if (preg_match('/src=["\']?(https?:\/\/[^"\'\s<>]*cinemapassion\.com\/covers_temp\/covers\d*\/[^"\'\s<>]+\.jpg)["\']?/i', $jaquettePageRes, $imgMatches)) { + $posterUrl = $imgMatches[1]; $posterUrl = str_replace('http://', 'https://', $posterUrl); - - // Vérifier que l'image existe vraiment - if (urlExists($posterUrl, 3)) { - error_log("CinemaPassion: ✅✅✅ Image trouvée (jaquette): '{$cleanTitle}' → {$posterUrl}"); - return ['poster' => $posterUrl, 'title' => $cleanTitle, 'format' => 'Blu-ray']; - } else { - error_log("CinemaPassion: ⚠️ Image trouvée mais inaccessible: {$posterUrl}"); - } + error_log("CinemaPassion: ✅✅✅ Image trouvée (jaquette): '{$cleanTitle}' → {$posterUrl}"); + return ['poster' => $posterUrl, 'title' => $cleanTitle, 'format' => 'Blu-ray']; } else { error_log("CinemaPassion: ❌ Image covers_temp non trouvée dans la page jaquette"); } @@ -297,24 +277,18 @@ function fetchCinemaPassion($title, $year = '', $ean = '', $pdo = null) { // ÉTAPE 6 : Fallback - Chercher covers_temp directement sur la page du film error_log("CinemaPassion: Tentative fallback sur la page film..."); - if (preg_match_all('/covers_temp\/covers\d*\/[A-Za-z0-9\-_]+\.jpg/i', $filmPageRes, $allMatches)) { - foreach ($allMatches[0] as $imgPath) { - if (strpos($imgPath, 'miniature') === false && strpos($imgPath, 'vign') === false) { - $posterUrl = $imgPath; - if (strpos($posterUrl, 'http') !== 0) { - $posterUrl = 'https://www.cinemapassion.com/' . ltrim($posterUrl, '/'); - } - $posterUrl = str_replace('http://', 'https://', $posterUrl); - - if (urlExists($posterUrl, 3)) { - error_log("CinemaPassion: ✅✅ Image trouvée (covers_temp direct): '{$cleanTitle}' → {$posterUrl}"); - return ['poster' => $posterUrl, 'title' => $cleanTitle, 'format' => 'Blu-ray']; - } + if (preg_match_all('/src=["\']?(https?:\/\/[^"\'\s<>]*cinemapassion\.com\/covers_temp\/covers\d*\/[^"\'\s<>]+\.jpg)["\']?/i', $filmPageRes, $allMatches)) { + foreach ($allMatches[1] as $imgUrl) { + if (strpos($imgUrl, 'miniature') === false && strpos($imgUrl, 'vign') === false) { + $posterUrl = str_replace('http://', 'https://', $imgUrl); + error_log("CinemaPassion: ✅✅ Image trouvée (covers_temp direct): '{$cleanTitle}' → {$posterUrl}"); + return ['poster' => $posterUrl, 'title' => $cleanTitle, 'format' => 'Blu-ray']; } } } - error_log("CinemaPassion: ❌❌ Image NON trouvée pour '{$cleanTitle}'"); + // ❌ SUPPRESSION du fallback sur lesaffiches/ qui donne de mauvaises images + error_log("CinemaPassion: ❌❌ Image NON trouvée pour '{$cleanTitle}' - Pas de fallback sur les affiches"); return ['poster' => $defaultPoster, 'title' => $cleanTitle, 'format' => 'Blu-ray']; }