'Trop de requêtes, réessayez plus tard']); exit; } // Vérifier que la requête est faite par AJAX if (!isset($_SERVER['HTTP_X_REQUESTED_WITH']) || strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) !== 'xmlhttprequest') { http_response_code(403); // Accès non autorisé echo json_encode(['error' => 'Accès non autorisé']); exit; } // Vérifier l'origine de la requête if (!validateAjaxOrigin()) { http_response_code(403); echo json_encode(['error' => 'Origine non autorisée']); exit; } // Vérifier le token CSRF if (!isset($_POST['csrf_token']) || !validateCSRFToken($_POST['csrf_token'])) { http_response_code(403); echo json_encode(['error' => 'Token CSRF invalide']); exit; } // Récupérer les paramètres $type = isset($_GET['type']) ? $_GET['type'] : ''; // Borner la page à [1, 1000] : au-delà il n'y a plus de contenu réel, et des // pages arbitrairement grandes contourneraient le cache de l'API PeerTube. $page = min(1000, validatePageNumber($_GET['page'] ?? 1)); $categoryId = isset($_GET['category']) ? intval($_GET['category']) : 0; // Vérifier que le type est valide if (!in_array($type, ['recent', 'trending', 'category'])) { http_response_code(400); // Requête incorrecte echo json_encode(['error' => 'Type de vidéos non valide']); exit; } // Vérifier que la catégorie est fournie si le type est 'category' if ($type === 'category' && $categoryId <= 0) { http_response_code(400); // Requête incorrecte echo json_encode(['error' => 'ID de catégorie manquant ou invalide']); exit; } // Récupérer les vidéos en fonction du type $videos = []; $offset = $page * LOAD_MORE_COUNT; switch ($type) { case 'recent': // Récupérer les vidéos récentes $data = callPeerTubeApi('videos', [ 'sort' => '-publishedAt', 'count' => LOAD_MORE_COUNT, 'start' => $offset, 'isLocal' => true ]); $videos = formatVideosData($data['data'] ?? []); break; case 'trending': // Récupérer les vidéos tendances $data = callPeerTubeApi('videos', [ 'sort' => '-views', 'count' => LOAD_MORE_COUNT, 'start' => $offset, 'isLocal' => true ]); $videos = formatVideosData($data['data'] ?? []); break; case 'category': // Récupérer les vidéos de la catégorie $data = callPeerTubeApi('videos', [ 'categoryOneOf' => $categoryId, 'count' => LOAD_MORE_COUNT, 'start' => $offset, 'sort' => '-publishedAt', // Les plus récentes d'abord 'isLocal' => true ]); $videos = formatVideosData($data['data'] ?? []); break; } // Préparer la réponse HTML $html = ''; foreach ($videos as $video) { $html .= renderVideoCard($video); } // Retourner la réponse echo json_encode([ 'success' => true, 'html' => $html, 'page' => $page, 'hasMore' => count($videos) >= LOAD_MORE_COUNT ]); ?>