diff --git a/api.php b/api.php
index 96c593d..56d0016 100644
--- a/api.php
+++ b/api.php
@@ -105,203 +105,155 @@ function extractYear($dateStr) {
return '';
}
-// ── API DVDFr (réécriture complète) ──
+l)) {
+ $result['format'] = 'DVD';
+ } elseif (preg_match('/\bVHS\b/i', $html)) {
+ $result['format'] = 'VHS';
+ }
+// ── API DVDFr (NOUVELLE VERSION : Scraping HTML car l'API XML est morte) ──
function fetchDVDFr($ean, $pdo) {
- if (empty($ean) || strlen((string)$ean) < 8) return null;
-
- $ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36';
- $baseHeaders = [
- 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
- 'Accept-Language: fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7',
- 'Accept-Encoding: gzip, deflate, br',
- 'Connection: keep-alive',
- ];
-
- // ── Helpers internes ──
- $curlGet = function(string $url) use ($ua, $baseHeaders): ?string {
- $ch = curl_init($url);
- curl_setopt_array($ch, [
- CURLOPT_RETURNTRANSFER => true,
- CURLOPT_TIMEOUT => 10,
- CURLOPT_CONNECTTIMEOUT => 5,
- CURLOPT_SSL_VERIFYPEER => false,
- CURLOPT_USERAGENT => $ua,
- CURLOPT_FOLLOWLOCATION => true,
- CURLOPT_MAXREDIRS => 5,
- CURLOPT_ENCODING => '', // décompression auto (gzip, br…)
- CURLOPT_HTTPHEADER => $baseHeaders,
- CURLOPT_COOKIEFILE => '', // active le jar de cookies en mémoire
- ]);
- $body = curl_exec($ch);
- $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
- curl_close($ch);
- if (!$body || $code !== 200) {
- error_log("DVDFr curlGet: HTTP $code pour $url");
- return null;
- }
- return $body;
- };
-
- $absoluteUrl = function(string $src): string {
- if (strpos($src, 'http') === 0) return $src;
- if (strpos($src, '//') === 0) return 'https:' . $src;
- if (strpos($src, '/') === 0) return 'https://www.dvdfr.com' . $src;
- return 'https://www.dvdfr.com/' . $src;
- };
-
- // ── ÉTAPE 1 : trouver l'URL de la fiche via la recherche ──
- $searchHtml = $curlGet('https://www.dvdfr.com/search/?q=' . urlencode($ean));
- if (!$searchHtml) {
- error_log("DVDFr: échec de la page de recherche pour EAN $ean");
+ if (empty($ean) || strlen($ean) < 8) return null;
+
+ $cacheKey = 'dvdfr_html_' . md5($ean);
+ $cached = getCache($pdo, $cacheKey);
+ if ($cached) return $cached;
+
+ $ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36';
+
+ // Étape 1 : Recherche par EAN sur le site DVDfr
+ $searchUrl = "https://www.dvdfr.com/dvd/recherche.html?search=" . urlencode($ean);
+
+ $ch = curl_init($searchUrl);
+ curl_setopt_array($ch, [
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_TIMEOUT => 10,
+ CURLOPT_CONNECTTIMEOUT => 5,
+ CURLOPT_SSL_VERIFYPEER => false,
+ CURLOPT_USERAGENT => $ua,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTPHEADER => [
+ 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
+ 'Accept-Language: fr-FR,fr;q=0.9',
+ ],
+ ]);
+ $html = curl_exec($ch);
+ $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
+ curl_close($ch);
+
+ if (!$html || $httpCode !== 200) {
+ error_log("DVDFr: Échec recherche HTML - HTTP $httpCode");
return null;
}
-
- // Patterns par ordre de priorité
- $ficheUrl = null;
- $patterns = [
- // lien direct vers une fiche /dvd/ ou /blu-ray/ contenant l'EAN dans l'URL
- '@href=["\']([^"\']*(?:dvd|blu-ray|4k|vhs|cd|coffret)[^"\']+\.html)["\']@i',
- // toute fiche .html dans le domaine dvdfr.com
- '@href=["\'](?:https?://(?:www\.)?dvdfr\.com)?(/[^"\']+\.html)["\']@i',
- ];
- foreach ($patterns as $pattern) {
- if (preg_match($pattern, $searchHtml, $m)) {
- $ficheUrl = $absoluteUrl($m[1]);
- break;
+
+ // Étape 2 : Extraire le lien vers la fiche du film
+ $dvdUrl = null;
+
+ // Chercher un lien vers une fiche DVD/Blu-ray qui contient l'EAN ou le premier résultat
+ if (preg_match('/href=["\']([^"\']*\/dvd\/[^"\']*\.html)["\']/i', $html, $matches)) {
+ $dvdUrl = $matches[1];
+ if (strpos($dvdUrl, 'http') !== 0) {
+ $dvdUrl = 'https://www.dvdfr.com' . $dvdUrl;
}
}
-
- if (!$ficheUrl) {
- error_log("DVDFr: aucune fiche trouvée pour EAN $ean");
+
+ if (!$dvdUrl) {
+ error_log("DVDFr: Aucune fiche trouvée pour EAN $ean");
return null;
}
- error_log("DVDFr: fiche → $ficheUrl");
-
- // ── ÉTAPE 2 : charger la fiche ──
- $html = $curlGet($ficheUrl);
- if (!$html) {
- error_log("DVDFr: impossible de charger la fiche $ficheUrl");
+
+ error_log("DVDFr: Fiche trouvée - $dvdUrl");
+
+ // Étape 3 : Récupérer la fiche complète
+ $ch2 = curl_init($dvdUrl);
+ curl_setopt_array($ch2, [
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_TIMEOUT => 10,
+ CURLOPT_CONNECTTIMEOUT => 5,
+ CURLOPT_SSL_VERIFYPEER => false,
+ CURLOPT_USERAGENT => $ua,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTPHEADER => [
+ 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
+ 'Accept-Language: fr-FR,fr;q=0.9',
+ ],
+ ]);
+ $ficheHtml = curl_exec($ch2);
+ curl_close($ch2);
+
+ if (!$ficheHtml) {
+ error_log("DVDFr: Impossible de charger la fiche");
return null;
}
-
- // ── ÉTAPE 3 : extraction des données ──
+
+ // Étape 4 : Extraire les données depuis le HTML
$result = [
'poster' => '',
- 'title' => '',
'publisher' => '',
'format' => '',
'length' => '',
'aspect' => '',
'discs' => '',
];
-
- // --- 3a. AFFICHE ---
- // Priorité 1 : og:image (le plus fiable)
- if (preg_match('/]+property=["\']og:image["\'][^>]+content=["\']([^"\']+)["\']/i', $html, $m) ||
- preg_match('/]+content=["\']([^"\']+)["\'][^>]+property=["\']og:image["\']/i', $html, $m)) {
- $result['poster'] = $m[1];
- error_log("DVDFr: affiche via og:image → " . $result['poster']);
+
+ // Extraction de l'affiche (plusieurs méthodes fallback)
+ // Méthode 1 : Chercher les balises meta Open Graph
+ if (preg_match('/]+property=["\']og:image["\'][^>]+content=["\']([^"\']+)["\']/i', $ficheHtml, $matches)) {
+ $result['poster'] = $matches[1];
}
-
- // Priorité 2 : JSON-LD
- if (empty($result['poster'])) {
- preg_match_all('/