diff --git a/classes/MediaService.php b/classes/MediaService.php index 5b59f56..6a069ff 100644 --- a/classes/MediaService.php +++ b/classes/MediaService.php @@ -23,7 +23,7 @@ class MediaService { } public function fetchAndStoreFromGraph($mediaId, $subdir = '') { - // Obtener metadata (url) + // Obtener metadata (url) via Graph API $endpoint = "{$this->apiUrl}/{$mediaId}"; $ch = curl_init(); curl_setopt_array($ch, [ @@ -46,11 +46,25 @@ class MediaService { $mediaUrl = $decoded['url'] ?? ($decoded['data'][0]['url'] ?? null); if (!$mediaUrl) throw new Exception('No media url from Graph'); - // Descargar contenido (primer intento) - $content = $this->downloadUrl($mediaUrl); + // Descargar contenido: primero wget (más confiable con Facebook CDN), luego curl como fallback + $content = $this->downloadWithWget($mediaUrl, !empty($this->token) ? ['Authorization: Bearer ' . $this->token] : []); if ($content === false) { - // Reintentar con header Referer (algunos endpoints requieren referer) - $content = $this->downloadUrl($mediaUrl, ['Referer: https://graph.facebook.com']); + // Obtener URL fresca del Graph API (la anterior puede haber expirado tras el intento fallido) + error_log("[MediaService] wget failed, trying curl with fresh URL..."); + $ch2 = curl_init($endpoint); + curl_setopt_array($ch2, [ + CURLOPT_RETURNTRANSFER => true, + CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $this->token], + CURLOPT_TIMEOUT => 15, + CURLOPT_IPRESOLVE => CURL_IPRESOLVE_V4, + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + ]); + $resp2 = curl_exec($ch2); + curl_close($ch2); + $decoded2 = json_decode($resp2, true); + $freshUrl = $decoded2['url'] ?? $mediaUrl; + + $content = $this->downloadUrl($freshUrl); } if ($content === false) throw new Exception('Failed to download media content from ' . $mediaUrl);