]*id="movie_review_intro"/is', $movieHtml, $infoBlock)) {
- $infoHtml = $infoBlock[1];
-
- // Synopsis
- if (preg_match('/<\/center>
\s*(.*?)
Director:/is', $infoHtml, $m)) {
- $synopsis = trim(strip_tags($m[1]));
- $synopsis = preg_replace('/\s+/', ' ', $synopsis);
- $empty['description'] = $synopsis;
- }
-
- // Réalisateur
- if (preg_match('/Director:\s*
]*>([^<]+)<\/a>/i', $infoHtml, $m)) {
- $empty['director'] = trim($m[1]);
- }
-
- // Acteurs
- if (preg_match('/Starring:\s*(.*?)(?:
|<\/div>)/is', $infoHtml, $m)) {
- $actorsHtml = $m[1];
- preg_match_all('/]*>([^<]+)<\/a>/i', $actorsHtml, $actorMatches);
- if (!empty($actorMatches[1])) {
- $empty['actors'] = implode(', ', array_map('trim', array_slice($actorMatches[1], 0, 6)));
+ } else {
+ error_log("Blu-ray.com: ⚠️ Jaquette absente du HTML statique (lazy-load JS), tentative CDN prévisible pour ID $movieId");
+ foreach (['_large.jpg', '_front.jpg'] as $suffix) {
+ $candidate = "https://images.static-bluray.com/movies/covers/{$movieId}{$suffix}";
+ if (urlExists($candidate)) {
+ $empty['poster'] = $candidate;
+ break;
}
}
+ if (empty($empty['poster'])) {
+ error_log("Blu-ray.com: ❌ Aucune URL de jaquette CDN valide trouvée pour ID $movieId (fallback TMDB attendu)");
+ }
}
-
+
+ // Synopsis, Réalisateur, Acteurs
+ // La div#movie_info / #movie_review_intro qui encadrait ces infos a disparu de la
+ // refonte du site : "Director:" et "Starring:" apparaissent maintenant directement
+ // dans le flux HTML de la page, donc on cherche sur $movieHtml en entier plutôt
+ // que dans un sous-bloc délimité par ces anciens ID.
+
+ // Réalisateur
+ if (preg_match('/Director:\s*]*>([^<]+)<\/a>/i', $movieHtml, $m)) {
+ $empty['director'] = trim(html_entity_decode($m[1]));
+ } else {
+ error_log("Blu-ray.com: ⚠️ Réalisateur non trouvé (structure HTML probablement changée)");
+ }
+
+ // Acteurs
+ if (preg_match('/Starring:\s*(.*?)(?:
|<\/(?:p|div|td)>)/is', $movieHtml, $m)) {
+ preg_match_all('/]*>([^<]+)<\/a>/i', $m[1], $actorMatches);
+ if (!empty($actorMatches[1])) {
+ $empty['actors'] = implode(', ', array_map(fn($a) => trim(html_entity_decode($a)), array_slice($actorMatches[1], 0, 6)));
+ }
+ } else {
+ error_log("Blu-ray.com: ⚠️ Acteurs non trouvés (structure HTML probablement changée)");
+ }
+
+ // Synopsis - on capture le dernier bloc de texte "libre" (hors balises) qui
+ // précède immédiatement "Director:", en tolérant quelques balises intermédiaires
+ if (preg_match('/>([^<]{60,900})<(?:[^>]*>){0,5}\s*Director:/is', $movieHtml, $m)) {
+ $synopsis = trim(html_entity_decode(strip_tags($m[1])));
+ $synopsis = preg_replace('/\s+/', ' ', $synopsis);
+ $empty['description'] = $synopsis;
+ } else {
+ error_log("Blu-ray.com: ⚠️ Synopsis non trouvé (structure HTML probablement changée)");
+ }
+
+ if (empty($empty['title'])) {
+ error_log("Blu-ray.com: ⚠️ Titre non extrait malgré une page trouvée pour ID $movieId — vérifier la structure du /");
+ }
+
error_log("Blu-ray.com: ✅ Données récupérées pour EAN $ean → " . $empty['title']);
return $empty;
}
@@ -528,24 +604,55 @@ function fetchFromMovieCovers($title, $year = '') {
];
if (empty($title)) return $empty;
-
- // Nettoyer le titre pour l'URL
- $urlTitle = strtoupper(str_replace(' ', '+', $title));
+
+ // Nettoyer le titre pour l'URL : moviecovers.com attend un titre en MAJUSCULES
+ // SANS accents ni apostrophes/ponctuation (ex: "L'Étrange Noël" -> "L+ETRANGE+NOEL").
+ // C'est la cause principale des échecs silencieux : un titre accentué produit une
+ // URL qui ne correspond à aucune fiche et retombe sur la page "non trouvé".
+ $normalized = removeAccentsForUrl($title);
+ $normalized = str_replace(['œ', 'Œ'], ['OE', 'OE'], $normalized);
+ $normalized = preg_replace('/[^A-Za-z0-9 ]+/', ' ', $normalized); // apostrophes, ':', '-', etc. -> espace
+ $normalized = preg_replace('/\s{2,}/', ' ', trim($normalized));
+ $urlTitle = strtoupper(str_replace(' ', '+', $normalized));
+
+ if ($urlTitle === '') {
+ error_log("MovieCovers: ❌ Titre vide après normalisation pour '$title'");
+ return $empty;
+ }
+
$url = "https://moviecovers.com/film/titre_{$urlTitle}.html";
-
+ error_log("MovieCovers: 🔍 Recherche '$title' → $url");
+
$html = httpGet($url, 10);
- if (!$html) return $empty;
-
+ if (!$html) {
+ error_log("MovieCovers: ❌ Échec HTTP pour $url");
+ return $empty;
+ }
+
+ // Le site répond en 200 même quand le film n'existe pas ("Je n'ai pas trouvé de film")
+ if (stripos($html, "n'ai pas trouv") !== false) {
+ error_log("MovieCovers: ❌ Film non trouvé pour '$title' (URL: $url)");
+ return $empty;
+ }
+
// Extraire le titre
if (preg_match('/([^<]+)<\/TITLE>/i', $html, $m)) {
$empty['title'] = trim($m[1]);
+ } elseif (preg_match('/]*property="og:title"[^>]*content="([^"]+)"/i', $html, $m)) {
+ $empty['title'] = trim(html_entity_decode($m[1]));
}
- // Extraire l'affiche
+ // Extraire l'affiche - plusieurs filets de sécurité, l'ordre des attributs
+ // (src/alt/title) dans le
n'étant pas garanti
if (preg_match('/
]*src="(https:\/\/moviecovers\.com\/DATA\/thumbs\/[^"]+)"[^>]*title="Recto/i', $html, $m)) {
$empty['poster'] = $m[1];
+ } elseif (preg_match('/title="Recto[^"]*"[^>]*src="(https:\/\/moviecovers\.com\/DATA\/thumbs\/[^"]+)"/i', $html, $m)) {
+ // Même image mais avec title AVANT src dans la balise
+ $empty['poster'] = $m[1];
} elseif (preg_match('/]*property="og:image"[^>]*content="([^"]+)"/i', $html, $m)) {
$empty['poster'] = $m[1];
+ } elseif (preg_match('/]*(?:property|name)="twitter:image"[^>]*content="([^"]+)"/i', $html, $m)) {
+ $empty['poster'] = $m[1];
}
// Extraire le réalisateur
@@ -576,8 +683,12 @@ function fetchFromMovieCovers($title, $year = '') {
// Format haute qualité de l'affiche
if ($empty['poster']) {
$empty['poster'] = str_replace('/thumbs/', '/films-l/', $empty['poster']);
+ } else {
+ error_log("MovieCovers: ⚠️ Jaquette non trouvée pour '$title' (URL: $url) — structure HTML probablement changée");
}
-
+
+ error_log("MovieCovers: " . (!empty($empty['title']) ? "✅ Données récupérées pour '$title' → " . $empty['title'] : "⚠️ Page trouvée mais titre non extrait pour '$title'"));
+
return $empty;
}