2025-04-08 10:49:46 +04:00
|
|
|
<?php
|
|
|
|
|
// Inclure la configuration
|
|
|
|
|
require_once '../includes/config.php';
|
|
|
|
|
|
2026-07-27 09:14:52 +04:00
|
|
|
// Limitation de débit : 30 requêtes / minute par IP (l'endpoint proxifie PeerTube)
|
|
|
|
|
if (!checkRateLimit($_SERVER['REMOTE_ADDR'] ?? 'unknown', 30, 60)) {
|
|
|
|
|
http_response_code(429); // Trop de requêtes
|
|
|
|
|
echo json_encode(['error' => 'Trop de requêtes, réessayez plus tard']);
|
|
|
|
|
exit;
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-08 10:49:46 +04:00
|
|
|
// 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;
|
|
|
|
|
}
|
|
|
|
|
|
2025-07-17 09:58:19 +04:00
|
|
|
// 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;
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-08 10:49:46 +04:00
|
|
|
// Récupérer les paramètres
|
|
|
|
|
$type = isset($_GET['type']) ? $_GET['type'] : '';
|
2026-07-27 09:14:52 +04:00
|
|
|
// 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));
|
2025-04-08 16:33:56 +04:00
|
|
|
$categoryId = isset($_GET['category']) ? intval($_GET['category']) : 0;
|
2025-04-08 10:49:46 +04:00
|
|
|
|
|
|
|
|
// Vérifier que le type est valide
|
2026-07-27 09:14:52 +04:00
|
|
|
if (!in_array($type, ['recent', 'trending', 'category'])) {
|
2025-04-08 10:49:46 +04:00
|
|
|
http_response_code(400); // Requête incorrecte
|
|
|
|
|
echo json_encode(['error' => 'Type de vidéos non valide']);
|
|
|
|
|
exit;
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-08 16:33:56 +04:00
|
|
|
// 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;
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-08 10:49:46 +04:00
|
|
|
// 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;
|
|
|
|
|
|
2025-04-08 16:33:56 +04:00
|
|
|
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;
|
2025-04-08 10:49:46 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Préparer la réponse HTML
|
|
|
|
|
$html = '';
|
|
|
|
|
|
|
|
|
|
foreach ($videos as $video) {
|
2026-07-27 01:54:42 +04:00
|
|
|
$html .= renderVideoCard($video);
|
2025-04-08 10:49:46 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Retourner la réponse
|
|
|
|
|
echo json_encode([
|
|
|
|
|
'success' => true,
|
|
|
|
|
'html' => $html,
|
|
|
|
|
'page' => $page,
|
|
|
|
|
'hasMore' => count($videos) >= LOAD_MORE_COUNT
|
|
|
|
|
]);
|
|
|
|
|
?>
|