diff --git a/api.php b/api.php index f8352e2..f865042 100644 --- a/api.php +++ b/api.php @@ -120,23 +120,28 @@ function extractYear($dateStr) { return ''; } +// ── Fanart.tv API (Jaquettes DVD/Blu-ray françaises uniquement) ── function fetchFanartTv($title, $year = '', $format = 'bluray', $pdo = null) { if (empty($title)) return null; $cleanTitle = cleanTitle($title); if (empty($cleanTitle)) return null; - // Récupérer la clé API - $apiKey = getFanartApiKey($pdo); - if (empty($apiKey)) { - // Fallback sur la clé en dur si non configurée - $apiKey = '70f9747dafe9b27f9b14ef80ee0cacc9'; + // Récupérer la clé API fanart.tv + $apiKey = '70f9747dafe9b27f9b14ef80ee0cacc9'; // Clé par défaut + if ($pdo) { + $stmt = $pdo->prepare("SELECT key_value FROM config WHERE key_name = 'fanart_api_key'"); + $stmt->execute(); + $row = $stmt->fetch(); + if ($row) { + $apiKey = decryptData($row['key_value']); + } } // Étape 1 : Chercher le film sur TMDB pour obtenir son ID $tmdbKey = getTmdbApiKey($pdo); if (!$tmdbKey) { - error_log("Fanart.tv: Clé TMDB requise pour obtenir l'ID du film"); + error_log("Fanart.tv: Clé TMDB requise"); return null; } @@ -144,6 +149,7 @@ function fetchFanartTv($title, $year = '', $format = 'bluray', $pdo = null) { if (!empty($year)) { $searchUrl .= "&year={$year}"; } + $searchUrl .= "&language=fr-FR"; $searchRes = httpGet($searchUrl, 5); $searchData = $searchRes ? json_decode($searchRes, true) : []; @@ -167,38 +173,49 @@ function fetchFanartTv($title, $year = '', $format = 'bluray', $pdo = null) { $poster = ''; - // Priorité aux movieposter (jaquettes complètes) + // PRIORITÉ 1 : movieposter en français (jaquettes DVD/Blu-ray FR) if (!empty($fanartData['movieposter'])) { - // Filtrer par langue (fr d'abord, puis en, puis tout) $posters = $fanartData['movieposter']; - $preferredLangs = ['fr', 'en', '']; - foreach ($preferredLangs as $lang) { - $filtered = array_filter($posters, function($p) use ($lang) { - return ($lang === '' || ($p['lang'] ?? '') === $lang); + // Filtrer uniquement les jaquettes françaises + $frenchPosters = array_filter($posters, function($p) { + return isset($p['lang']) && $p['lang'] === 'fr'; + }); + + // Trier par likes (le plus populaire en premier) + if (!empty($frenchPosters)) { + usort($frenchPosters, function($a, $b) { + return ($b['likes'] ?? 0) - ($a['likes'] ?? 0); }); - - if (!empty($filtered)) { - // Trier par likes (le plus populaire en premier) - usort($filtered, function($a, $b) { - return ($b['likes'] ?? 0) - ($a['likes'] ?? 0); - }); - $poster = $filtered[0]['url']; - break; - } + $poster = $frenchPosters[0]['url']; + error_log("Fanart.tv: Jaquette FR trouvée - {$poster}"); } } - // Fallback sur hdmovielogo si pas de movieposter - if (empty($poster) && !empty($fanartData['hdmovielogo'])) { - $logos = $fanartData['hdmovielogo']; - $poster = $logos[0]['url']; + // PRIORITÉ 2 : Si pas de jaquette FR, prendre movieposter en anglais + if (empty($poster) && !empty($fanartData['movieposter'])) { + $posters = $fanartData['movieposter']; + $englishPosters = array_filter($posters, function($p) { + return isset($p['lang']) && $p['lang'] === 'en'; + }); + + if (!empty($englishPosters)) { + usort($englishPosters, function($a, $b) { + return ($b['likes'] ?? 0) - ($a['likes'] ?? 0); + }); + $poster = $englishPosters[0]['url']; + error_log("Fanart.tv: Jaquette EN trouvée (fallback) - {$poster}"); + } } - // Fallback sur moviebackground - if (empty($poster) && !empty($fanartData['moviebackground'])) { - $backgrounds = $fanartData['moviebackground']; - $poster = $backgrounds[0]['url']; + // PRIORITÉ 3 : Fallback sur n'importe quelle langue + if (empty($poster) && !empty($fanartData['movieposter'])) { + $posters = $fanartData['movieposter']; + usort($posters, function($a, $b) { + return ($b['likes'] ?? 0) - ($a['likes'] ?? 0); + }); + $poster = $posters[0]['url']; + error_log("Fanart.tv: Jaquette trouvée (toute langue) - {$poster}"); } if (empty($poster)) { @@ -342,24 +359,19 @@ switch ($action) { echo json_encode(["success" => true]); break; - case 'get_config_keys': - checkAuth($pdo); - $stmt = $pdo->prepare("SELECT key_value FROM config WHERE key_name IN ('tmdb_api_key', 'fanart_api_key')"); - $stmt->execute(); - $rows = $stmt->fetchAll(); - $config = []; - foreach ($rows as $row) { - if ($row['key_name'] === 'tmdb_api_key') { - $config['tmdb_api_key'] = $row['key_value'] ? '••••••••' : ''; - } elseif ($row['key_name'] === 'fanart_api_key') { - $config['fanart_api_key'] = $row['key_value'] ? '••••••••' : ''; - } - } - // Valeurs par défaut si non configurées - if (!isset($config['tmdb_api_key'])) $config['tmdb_api_key'] = ''; - if (!isset($config['fanart_api_key'])) $config['fanart_api_key'] = ''; - echo json_encode($config); - break; +case 'get_config_keys': + checkAuth($pdo); + $stmt = $pdo->prepare("SELECT key_name, key_value FROM config WHERE key_name IN ('tmdb_api_key', 'fanart_api_key')"); + $stmt->execute(); + $rows = $stmt->fetchAll(); + $config = []; + foreach ($rows as $row) { + $config[$row['key_name']] = $row['key_value'] ? '••••••••' : ''; + } + if (!isset($config['tmdb_api_key'])) $config['tmdb_api_key'] = ''; + if (!isset($config['fanart_api_key'])) $config['fanart_api_key'] = ''; + echo json_encode($config); + break; case 'save_config': checkAuth($pdo); @@ -370,9 +382,10 @@ switch ($action) { $stmt->execute([$keyName, encryptData($keyValue)]); echo json_encode(["success" => true]); } else { - http_response_code(400); echo json_encode(["error" => "Données invalides."]); + http_response_code(400); + echo json_encode(["error" => "Données invalides."]); } - break; + break; case 'get_films': $sql = " @@ -428,12 +441,12 @@ switch ($action) { exit; } - if ($type === 'videotheque') { + if ($type === 'videotheque') { $format = $result['format'] ?: 'Blu-ray'; - $dcData = fetchFanartTv($titleForSearch, $result['year'], $format, $pdo); - if (!empty($dcData)) { - if (!empty($dcData['poster'])) $result['poster'] = $dcData['poster']; - if (!empty($dcData['title'])) $result['title'] = $dcData['title']; + $fanartData = fetchFanartTv($titleForSearch, $result['year'], $format, $pdo); + if (!empty($fanartData)) { + if (!empty($fanartData['poster'])) $result['poster'] = $fanartData['poster']; + if (!empty($fanartData['title'])) $result['title'] = $fanartData['title']; $result['format'] = $format; } } else { @@ -476,9 +489,9 @@ switch ($action) { } else { if (empty($data['poster']) && !empty($data['title'])) { $format = $data['format'] ?: 'Blu-ray'; - $dcData = fetchFanartTv($data['title'], $data['year'] ?? '', $format, $pdo); - if (!empty($dcData['poster'])) { - $data['poster'] = $dcData['poster']; + $fanartData = fetchFanartTv($data['title'], $data['year'] ?? '', $format, $pdo); + if (!empty($fanartData['poster'])) { + $data['poster'] = $fanartData['poster']; } } @@ -584,13 +597,13 @@ switch ($action) { // Récupération jaquette via DVDCover API $cleanTitleForDC = cleanTitle($title); if (!empty($cleanTitleForDC)) { - $dcData = fetchFanartTv($cleanTitleForDC, $year, $format, $pdo); - if (!empty($dcData)) { - if (!empty($dcData['poster'])) { - $poster = $dcData['poster']; + $fanartData = fetchFanartTv($cleanTitleForDC, $year, $format, $pdo); + if (!empty($fanartData)) { + if (!empty($fanartData['poster'])) { + $poster = $fanartData['poster']; } - if (!empty($dcData['title']) && ($title === 'Sans titre' || empty($title))) { - $title = $dcData['title']; + if (!empty($fanartData['title']) && ($title === 'Sans titre' || empty($title))) { + $title = $fanartData['title']; } } } @@ -632,62 +645,15 @@ switch ($action) { } break; - case 'debug_dvdcover': + case 'debug_fanart': $title = $_GET['title'] ?? ''; $year = $_GET['year'] ?? ''; - $format = $_GET['format'] ?? 'Blu-ray'; - if (!$title) { echo json_encode(['error' => 'Titre manquant']); exit; } - $result = ['title' => $title, 'year' => $year, 'format' => $format]; - - // Test direct de l'API - $cleanTitle = cleanTitle($title); - $apiUrl = "https://www.dvdcover.com/wp-json/wp/v2/posts?search=" . urlencode($cleanTitle) . "&_embed&per_page=5"; - $result['api_url'] = $apiUrl; - - $json = httpGet($apiUrl, 10); - if ($json) { - $posts = json_decode($json, true); - $result['posts_count'] = is_array($posts) ? count($posts) : 0; - $result['posts'] = []; - - if (is_array($posts)) { - foreach ($posts as $post) { - $postData = [ - 'id' => $post['id'] ?? null, - 'title' => $post['title']['rendered'] ?? '', - 'link' => $post['link'] ?? '', - ]; - - // Extraire les images - $imgs = []; - if (isset($post['_embedded']['wp:featuredmedia'][0])) { - $featured = $post['_embedded']['wp:featuredmedia'][0]; - if (!empty($featured['source_url'])) { - $imgs[] = $featured['source_url']; - } - if (!empty($featured['media_details']['sizes'])) { - foreach ($featured['media_details']['sizes'] as $size => $data) { - if (!empty($data['source_url'])) { - $imgs[] = $data['source_url'] . " ($size)"; - } - } - } - } - $postData['images'] = $imgs; - - $result['posts'][] = $postData; - } - } - } else { - $result['api_error'] = 'Impossible de joindre l\'API'; - } - - // Test de la fonction complète - $data = fetchDVDCover($title, $year, $format); - $result['fetch_result'] = $data; - $result['status'] = $data ? 'OK' : 'AUCUN_RÉSULTAT'; + $result = ['title' => $title, 'year' => $year]; + $fanartData = fetchFanartTv($title, $year, 'Blu-ray', $pdo); + $result['data'] = $fanartData; + $result['status'] = $fanartData ? 'OK' : 'AUCUN_RÉSULTAT'; echo json_encode($result, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); exit;