apiKey = $apiKey ?? $_ENV['STEAMGRIDDB_API_KEY'] ?? null; $this->client = new Client([ 'base_uri' => self::BASE_URI, 'headers' => [ 'Authorization' => 'Bearer ' . $this->apiKey, 'Accept' => 'application/json', ], 'http_errors' => false, ]); } /** * Search for games by name */ public function searchGames(string $query): array { try { $response = $this->client->get('search/autocomplete/' . urlencode($query)); $data = json_decode($response->getBody()->getContents(), true); return $data['data'] ?? []; } catch (GuzzleException $e) { return []; } } /** * Get game by ID */ public function getGame(int $gameId): ?array { try { $response = $this->client->get('games/id/' . $gameId); $data = json_decode($response->getBody()->getContents(), true); return $data['data'] ?? null; } catch (GuzzleException $e) { return null; } } /** * Get game grids (covers) */ public function getGrids(int $gameId, array $options = []): array { return $this->getMedia('grids/game/' . $gameId, $options); } /** * Get game heroes (backgrounds) */ public function getHeroes(int $gameId, array $options = []): array { return $this->getMedia('heroes/game/' . $gameId, $options); } /** * Get game icons */ public function getIcons(int $gameId, array $options = []): array { return $this->getMedia('icons/game/' . $gameId, $options); } /** * Get game logos */ public function getLogos(int $gameId, array $options = []): array { return $this->getMedia('logos/game/' . $gameId, $options); } /** * Download a media file */ public function downloadMedia(string $url): ?string { try { $response = $this->client->get($url, ['stream' => true]); if ($response->getStatusCode() !== 200) { return null; } $tempFile = tempnam(sys_get_temp_dir(), 'sgdb_'); file_put_contents($tempFile, $response->getBody()); return $tempFile; } catch (GuzzleException $e) { return null; } } private function getMedia(string $endpoint, array $options = []): array { $query = []; if (!empty($options['styles'])) { $query['styles'] = is_array($options['styles']) ? implode(',', $options['styles']) : $options['styles']; } if (!empty($options['dimensions'])) { $query['dimensions'] = is_array($options['dimensions']) ? implode(',', $options['dimensions']) : $options['dimensions']; } if (!empty($options['mimes'])) { $query['mimes'] = is_array($options['mimes']) ? implode(',', $options['mimes']) : $options['mimes']; } if (!empty($options['types'])) { $query['types'] = is_array($options['types']) ? implode(',', $options['types']) : $options['types']; } try { $response = $this->client->get($endpoint, ['query' => $query]); $data = json_decode($response->getBody()->getContents(), true); return $data['data'] ?? []; } catch (GuzzleException $e) { return []; } } }