Fix IGDB search: remove where category=0 filter that blocked all results; fix cover.url handling in both search and applyIgdbId; add debug logging

This commit is contained in:
David Alvarez
2026-05-25 12:03:40 +02:00
parent 466299b8f0
commit 672be01e8c
+31 -12
View File
@@ -97,9 +97,8 @@ public class IgdbService {
String apql = "search \"" + sanitize(query) + "\";"
+ " fields name,first_release_date,genres.name,"
+ " involved_companies.company.name,involved_companies.developer,involved_companies.publisher,"
+ " summary,cover,platforms;"
+ " where category = 0;"
+ " limit 10;";
+ " summary,cover.url,platforms;"
+ " limit 20;";
HttpRequest req = igdbRequest("/games")
.POST(HttpRequest.BodyPublishers.ofString(apql))
@@ -107,12 +106,15 @@ public class IgdbService {
HttpResponse<String> res = http.send(req, HttpResponse.BodyHandlers.ofString());
if (res.statusCode() != 200) {
LOG.warning("IGDB search failed: HTTP " + res.statusCode());
LOG.warning("IGDB search failed: HTTP " + res.statusCode() + " " + res.body());
return List.of();
}
JsonNode results = mapper.readTree(res.body());
if (!results.isArray()) return List.of();
if (!results.isArray() || results.isEmpty()) {
LOG.info("IGDB search: no results for '" + query + "'. Response: " + res.body());
return List.of();
}
List<Map<String, Object>> out = new ArrayList<>();
for (JsonNode game : results) {
@@ -167,9 +169,16 @@ public class IgdbService {
entry.put("is_dos", isDos);
}
// Cover URL (fetch from covers endpoint if ID is present)
if (game.has("cover") && game.get("cover").has("id")) {
int coverId = game.get("cover").get("id").asInt();
// Cover URL — IGDB now returns cover as object with url (since we use cover.url in fields)
if (game.has("cover") && game.get("cover").has("url")) {
String thumbUrl = game.get("cover").get("url").asText();
// IGDB URL format: //images.igdb.com/igdb/image/upload/t_thumb/co1x8h.jpg
// Replace t_thumb with our desired size
String coverUrl = "https:" + thumbUrl.replace("t_thumb", COVER_SIZE);
entry.put("cover_url", coverUrl);
} else if (game.has("cover") && game.get("cover").isInt()) {
// Fallback: cover is just an integer ID, fetch URL separately
int coverId = game.get("cover").asInt();
String coverUrl = fetchCoverUrl(coverId);
if (coverUrl != null) {
entry.put("cover_url", coverUrl);
@@ -245,7 +254,7 @@ public class IgdbService {
// Fetch game details from IGDB by ID
String apql = "fields name,first_release_date,genres.name,"
+ " involved_companies.company.name,involved_companies.developer,involved_companies.publisher,"
+ " summary,cover;"
+ " summary,cover.url;"
+ " where id = " + igdbId + ";";
HttpRequest req = igdbRequest("/games")
@@ -379,11 +388,21 @@ public class IgdbService {
map.put("summary", node.get("summary").asText());
}
// Fetch cover URL
if (node.has("cover") && node.get("cover").has("id")) {
// Fetch cover URL — handle cover.url object or raw ID
if (node.has("cover")) {
JsonNode cover = node.get("cover");
try {
String coverUrl = fetchCoverUrl(node.get("cover").get("id").asInt());
if (cover.has("url")) {
String thumbUrl = cover.get("url").asText();
String coverUrl = "https:" + thumbUrl.replace("t_thumb", COVER_SIZE);
map.put("cover_url", coverUrl);
} else if (cover.isInt() || cover.isLong()) {
String coverUrl = fetchCoverUrl(cover.asInt());
if (coverUrl != null) map.put("cover_url", coverUrl);
} else if (cover.has("id")) {
String coverUrl = fetchCoverUrl(cover.get("id").asInt());
if (coverUrl != null) map.put("cover_url", coverUrl);
}
} catch (Exception ignored) {}
}