diff --git a/api.php b/api.php index dfdcbc8..2ed692e 100644 --- a/api.php +++ b/api.php @@ -146,149 +146,51 @@ function fetchCinemaPassion($title, $year = '', $ean = '', $pdo = null) { return ['poster' => $defaultPoster, 'title' => '', 'format' => 'Blu-ray']; } - error_log("=== CinemaPassion: Début recherche pour '{$cleanTitle}' ==="); + // 1. Recherche en GET (beaucoup plus fiable que le POST sur ce site) + $searchUrl = "https://www.cinemapassion.com/recherche.php?recherche=" . urlencode($cleanTitle); + $searchRes = httpGet($searchUrl, 10); - // ÉTAPE 1 : Recherche POST sur /moteur2.php - $searchRes = httpPost('https://www.cinemapassion.com/moteur2.php', ['recherche' => $cleanTitle]); - - if (!$searchRes) { - error_log("CinemaPassion: ❌ Recherche échouée pour '{$cleanTitle}'"); - return ['poster' => $defaultPoster, 'title' => $cleanTitle, 'format' => 'Blu-ray']; - } - - error_log("CinemaPassion: ✅ Recherche OK, " . strlen($searchRes) . " caractères reçus"); - - // É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 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"); - - foreach ($allMatches as $match) { - $linkName = $match[1]; - $linkId = $match[2]; - $linkTitle = trim($match[3]); + if ($searchRes) { + // 2. Extraire directement le premier lien de film + // On ne cherche plus à lire le contenu de la balise pour éviter les bugs liés au HTML interne + if (preg_match('/href=["\']?(?:\.\.\/)?(film\/[^"\'\s<>]+-\d+\.php)["\']?/i', $searchRes, $matches)) { + $filmUrl = "https://www.cinemapassion.com/" . ltrim($matches[1], './'); + $filmRes = httpGet($filmUrl, 10); - // Nettoyer le titre du lien pour comparaison - $linkTitleClean = cleanTitle($linkTitle); - $linkNameClean = str_replace('-', ' ', $linkName); - - // Calculer un score de correspondance - $score = 0; - - // Correspondance exacte (titre ou nom URL) - if (strcasecmp($linkTitleClean, $cleanTitle) === 0) { - $score = 100; - error_log("CinemaPassion: ✅✅✅ CORRESPONDANCE EXACTE (titre): '{$linkTitle}'"); - } elseif (strcasecmp($linkNameClean, $cleanTitle) === 0) { - $score = 90; - error_log("CinemaPassion: ✅✅ CORRESPONDANCE EXACTE (URL): '{$linkName}'"); - } - // 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 début: '{$linkTitle}' contient '{$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 - ]; - } - } - - // Utiliser la meilleure correspondance SI le score est suffisant (au moins 70) - if ($bestMatch && $bestMatch['score'] >= 70) { - $filmUrl = "https://www.cinemapassion.com/film/{$bestMatch['name']}-{$bestMatch['id']}.php"; - $filmName = $bestMatch['name']; - $filmId = $bestMatch['id']; - error_log("CinemaPassion: ✅ Meilleur match sélectionné (score: {$bestMatch['score']}): {$filmName}-{$filmId}"); - } else { - 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']; - } - - // ÉTAPE 3 : Aller sur la page du film - error_log("CinemaPassion: Accès à la page film: {$filmUrl}"); - $filmPageRes = httpGet($filmUrl, 10); - - if (!$filmPageRes) { - error_log("CinemaPassion: ❌ Page film inaccessible : {$filmUrl}"); - return ['poster' => $defaultPoster, 'title' => $cleanTitle, 'format' => 'Blu-ray']; - } - - error_log("CinemaPassion: ✅ Page film OK, " . strlen($filmPageRes) . " caractères reçus"); - - // ÉTAPE 4 : Chercher le lien vers la jaquette DVD ou Blu-ray - $jaquetteUrl = null; - - // 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 covers_temp - if ($jaquetteUrl) { - error_log("CinemaPassion: Accès à la page jaquette: {$jaquetteUrl}"); - $jaquettePageRes = httpGet($jaquetteUrl, 10); - - if ($jaquettePageRes) { - error_log("CinemaPassion: ✅ Page jaquette OK, " . strlen($jaquettePageRes) . " caractères reçus"); - - // ✅ 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); - 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"); - } - } else { - error_log("CinemaPassion: ❌ Page jaquette inaccessible: {$jaquetteUrl}"); - } - } - - // É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('/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']; + if ($filmRes) { + // 3. Chercher la page jaquette haute définition + $jaquetteUrl = null; + if (preg_match('/href=["\']?(?:\.\.\/)?(jaquette-(?:dvd|blu-ray)-[^"\'\s<>]+\.php)["\']?/i', $filmRes, $jaqMatches)) { + $jaquetteUrl = "https://www.cinemapassion.com/" . ltrim($jaqMatches[1], './'); + $jaquetteRes = httpGet($jaquetteUrl, 10); + + if ($jaquetteRes) { + // 4. Extraire l'image covers_temp + if (preg_match('/src=["\']?(https?:\/\/(?:www\.)?cinemapassion\.com\/covers_temp\/covers\d*\/[^"\'\s<>]+\.jpg)["\']?/i', $jaquetteRes, $imgMatches)) { + return [ + 'poster' => str_replace('http://', 'https://', $imgMatches[1]), + 'title' => $cleanTitle, + 'format' => 'Blu-ray' + ]; + } + } + } + + // 5. Fallback : si pas de page jaquette, on cherche covers_temp sur la page principale du film + if (preg_match('/src=["\']?(https?:\/\/(?:www\.)?cinemapassion\.com\/covers_temp\/covers\d*\/[^"\'\s<>]+\.jpg)["\']?/i', $filmRes, $imgMatches)) { + if (strpos($imgMatches[1], 'miniature') === false && strpos($imgMatches[1], 'vign') === false) { + return [ + 'poster' => str_replace('http://', 'https://', $imgMatches[1]), + 'title' => $cleanTitle, + 'format' => 'Blu-ray' + ]; + } + } } } } - // ❌ 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"); + // Si la recherche échoue, on retourne l'image par défaut return ['poster' => $defaultPoster, 'title' => $cleanTitle, 'format' => 'Blu-ray']; }