From e1d837bc7872c762685ba183b4caf5d4b4d082b9 Mon Sep 17 00:00:00 2001 From: lobo Date: Fri, 25 Sep 2026 15:24:05 +0200 Subject: [PATCH] fix(igdb): search only games a user can own and play The search listed DLC and e-Reader levels, and the limit of 10 pushed the main games out. Keep main games, standalone expansions, seasons, remakes, remasters, expanded games and ports, and show 20 hits. --- .../modules/igdb_adapter/service/IgdbApiService.java | 7 +++++-- .../modules/igdb_adapter/service/IgdbApiServiceTest.java | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/core_service/modules/igdb_adapter/service/IgdbApiService.java b/src/main/java/core_service/modules/igdb_adapter/service/IgdbApiService.java index dc95807..55822fc 100644 --- a/src/main/java/core_service/modules/igdb_adapter/service/IgdbApiService.java +++ b/src/main/java/core_service/modules/igdb_adapter/service/IgdbApiService.java @@ -49,7 +49,10 @@ public class IgdbApiService { */ public record Game(long igdbId, String name, Integer year, String imageUrl, List platforms, Long steamAppid) {} - private static final int SEARCH_LIMIT = 10; + private static final int SEARCH_LIMIT = 20; + // IGDB game types a user can own and play on their own: main game, standalone expansion, season, remake, + // remaster, expanded game, port. Leaves out DLC, bundles, mods, episodes, packs and updates. + private static final String PLAYABLE_GAME_TYPES = "(0,4,7,8,9,10,11)"; private static final String GAME_FIELDS = "fields name,first_release_date,cover.image_id,artworks.image_id," + "screenshots.image_id,platforms.name,platforms.abbreviation,external_games.external_game_source," + "external_games.uid;"; @@ -118,7 +121,7 @@ public class IgdbApiService { } try { IgdbResponses.Game[] games = query("/games", "search \"" + searchText(query) + "\"; " + GAME_FIELDS - + " where version_parent = null; limit " + SEARCH_LIMIT + ";", IgdbResponses.Game[].class); + + " where version_parent = null & game_type = " + PLAYABLE_GAME_TYPES + "; limit " + SEARCH_LIMIT + ";", IgdbResponses.Game[].class); return Optional.of(Arrays.stream(games).map(IgdbApiService::toGame).flatMap(Optional::stream).toList()); } catch (Exception e) { log.error("Error searching IGDB games", e); diff --git a/src/test/java/core_service/modules/igdb_adapter/service/IgdbApiServiceTest.java b/src/test/java/core_service/modules/igdb_adapter/service/IgdbApiServiceTest.java index 1369a4a..1817d67 100644 --- a/src/test/java/core_service/modules/igdb_adapter/service/IgdbApiServiceTest.java +++ b/src/test/java/core_service/modules/igdb_adapter/service/IgdbApiServiceTest.java @@ -194,7 +194,7 @@ class IgdbApiServiceTest extends AbstractUnitTest { expectToken(); igdb.expect(requestTo(containsString("/games"))) .andExpect(content().string(allOf(containsString("search \"zelda\";"), containsString("version_parent = null"), - containsString("limit 10")))) + containsString("game_type = (0,4,7,8,9,10,11)"), containsString("limit 20")))) .andRespond(withSuccess(ZELDA, MediaType.APPLICATION_JSON)); List games = service.searchGames(" zelda ").orElseThrow();