cacheDir = __DIR__ . '/../cache/api'; $this->enabled = true; // Créer le répertoire de cache s'il n'existe pas if (!is_dir($this->cacheDir)) { mkdir($this->cacheDir, 0755, true); } } /** * Génère une clé de cache */ private function getCacheKey($endpoint, $params = []) { $key = $endpoint; if (!empty($params)) { ksort($params); $key .= '_' . md5(serialize($params)); } return 'cache_' . md5($key) . '.json'; } /** * Récupère depuis le cache */ public function get($endpoint, $params = []) { if (!$this->enabled) return null; $file = $this->cacheDir . '/' . $this->getCacheKey($endpoint, $params); if (!file_exists($file)) { return null; } $data = json_decode(file_get_contents($file), true); // Vérifier l'expiration if (isset($data['expires']) && time() > $data['expires']) { unlink($file); return null; } return $data['content'] ?? null; } /** * Stocke dans le cache */ public function set($endpoint, $params, $content, $ttl = 300) { if (!$this->enabled) return; $file = $this->cacheDir . '/' . $this->getCacheKey($endpoint, $params); $data = [ 'content' => $content, 'expires' => time() + $ttl, 'created' => time() ]; file_put_contents($file, json_encode($data)); } /** * Nettoie le cache expiré */ public function cleanup() { $files = glob($this->cacheDir . '/cache_*.json'); $cleaned = 0; foreach ($files as $file) { $data = json_decode(file_get_contents($file), true); if (isset($data['expires']) && time() > $data['expires']) { unlink($file); $cleaned++; } } return $cleaned; } } // Instance globale $GLOBALS['simple_api_cache'] = new SimpleAPICache(); /** * Version cachée de callPeerTubeApi - remplace l'originale */ function callPeerTubeApiCached($endpoint, $params = []) { $cache = $GLOBALS['simple_api_cache']; // TTL selon le type de contenu $ttlMap = [ 'videos/categories' => 3600, // 1 heure 'videos' => 300, // 5 minutes 'search/videos' => 600 // 10 minutes ]; $ttl = $ttlMap[$endpoint] ?? 300; // Essayer le cache d'abord $cached = $cache->get($endpoint, $params); if ($cached !== null) { return $cached; } // Appeler l'API originale $data = callPeerTubeApiOriginal($endpoint, $params); // Mettre en cache si on a des données if (!empty($data)) { $cache->set($endpoint, $params, $data, $ttl); } return $data; } // Nettoyage automatique occasionnel if (rand(1, 100) === 1) { $GLOBALS['simple_api_cache']->cleanup(); } ?>