isInstagramUrl($url)) { return $this->download($url, $pathWithoutExtension); } return null; } private function download(string $url, string $pathWithoutExtension): ?string { try { $response = Http::withHeaders(['User-Agent' => 'Mozilla/5.0'])->timeout(30)->get($url); } catch (Throwable $e) { Log::warning(static::class.": failed to fetch {$url}: {$e->getMessage()}"); return null; } if (! $response->successful()) { Log::warning(static::class.": got {$response->status()} fetching {$url}"); return null; } $path = $pathWithoutExtension.'.'.$this->guessExtension($url, $response->header('Content-Type')); Storage::disk('public')->put($path, $response->body()); return '/storage/'.$path; } private function guessExtension(string $url, ?string $contentType): string { $fromUrl = pathinfo(parse_url($url, PHP_URL_PATH) ?? '', PATHINFO_EXTENSION); if ($fromUrl && strlen($fromUrl) <= 4) { return strtolower($fromUrl); } return str_contains((string) $contentType, 'video') ? 'mp4' : 'jpg'; } }