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' => 600, // 10 minutes (augmenté) 'search/videos' => 600, // 10 minutes 'wp-posts' => 900, // 15 minutes pour WordPress 'accounts' => 300 // 5 minutes pour live streams ]; // TTL dynamique selon l'endpoint $ttl = 300; // Défaut 5 minutes foreach ($ttlMap as $pattern => $time) { if (strpos($endpoint, $pattern) !== false) { $ttl = $time; break; } } // 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; } /** * Cache générique pour tout type d'API */ function callApiCached($cacheKey, $callable, $ttl = 900) { $cache = $GLOBALS['simple_api_cache']; // Essayer le cache d'abord $cached = $cache->get($cacheKey, []); if ($cached !== null) { return $cached; } // Appeler la fonction fournie try { $data = call_user_func($callable); } catch (Exception $e) { error_log('API call failed for ' . $cacheKey . ': ' . $e->getMessage()); return []; } // Mettre en cache si on a des données if (!empty($data)) { $cache->set($cacheKey, [], $data, $ttl); } return $data; } // Nettoyage automatique occasionnel if (rand(1, 100) === 1) { $GLOBALS['simple_api_cache']->cleanup(); } ?>