diff --git a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/GameService.kt b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/GameService.kt index fe97c4c..75731c1 100644 --- a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/GameService.kt +++ b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/GameService.kt @@ -1,6 +1,7 @@ package de.grimsi.gameyfin.games import de.grimsi.gameyfin.core.filterValuesNotNull +import de.grimsi.gameyfin.core.plugins.management.PluginManagementEntry import de.grimsi.gameyfin.core.plugins.management.PluginManagementService import de.grimsi.gameyfin.games.dto.GameDto import de.grimsi.gameyfin.games.dto.GameMetadataDto @@ -131,6 +132,7 @@ class GameService( private fun mergeResults(results: List>, path: Path): Game { val mergedGame = Game(path = path.toString()) val metadataMap = mutableMapOf() + val originalIdsMap = mutableMapOf() // Sort results by plugin priority val sortedResults = results.sortedByDescending { @@ -139,7 +141,10 @@ class GameService( sortedResults.forEach { (provider, metadata) -> val sourcePlugin = pluginManagementService.getPluginManagementEntry(provider.javaClass) + metadata?.let { + originalIdsMap[sourcePlugin] = metadata.originalId + it.title.takeIf { it.isNotBlank() }?.let { title -> if (!metadataMap.containsKey("title")) { mergedGame.title = title @@ -164,6 +169,18 @@ class GameService( metadataMap["release"] = FieldMetadata(sourcePlugin) } } + it.userRating?.let { userRating -> + if (!metadataMap.containsKey("userRating")) { + mergedGame.userRating = userRating + metadataMap["userRating"] = FieldMetadata(sourcePlugin) + } + } + it.criticRating?.let { criticRating -> + if (!metadataMap.containsKey("criticRating")) { + mergedGame.criticRating = criticRating + metadataMap["criticRating"] = FieldMetadata(sourcePlugin) + } + } it.publishedBy?.takeIf { it.isNotEmpty() }?.let { publishedBy -> if (!metadataMap.containsKey("publishers")) { mergedGame.publishers = @@ -225,6 +242,7 @@ class GameService( } mergedGame.metadata = metadataMap + mergedGame.originalIds = originalIdsMap return mergedGame } @@ -238,6 +256,8 @@ class GameService( comment = game.comment, summary = game.summary, release = game.release, + userRating = game.userRating, + criticRating = game.criticRating, publishers = game.publishers?.map { it.name }, developers = game.developers?.map { it.name }, genres = game.genres?.map { it.name }, @@ -248,7 +268,8 @@ class GameService( imageIds = game.images?.mapNotNull { it.id }, videoUrls = game.videoUrls?.map { it.toString() }, path = game.path, - metadata = toDto(game.metadata) + metadata = toDto(game.metadata), + originalIds = game.originalIds.mapKeys { it.key.pluginId } ) } diff --git a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/dto/GameDto.kt b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/dto/GameDto.kt index 5e48864..08cd3c8 100644 --- a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/dto/GameDto.kt +++ b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/dto/GameDto.kt @@ -9,6 +9,8 @@ class GameDto( val comment: String?, val summary: String?, val release: Instant?, + val userRating: Int?, + val criticRating: Int?, val publishers: List?, val developers: List?, val genres: List?, @@ -19,5 +21,6 @@ class GameDto( val imageIds: List?, val videoUrls: List?, val path: String, - val metadata: Map + val metadata: Map, + val originalIds: Map ) \ No newline at end of file diff --git a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/entities/Game.kt b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/entities/Game.kt index 86caee0..435d467 100644 --- a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/entities/Game.kt +++ b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/entities/Game.kt @@ -1,5 +1,6 @@ package de.grimsi.gameyfin.games.entities +import de.grimsi.gameyfin.core.plugins.management.PluginManagementEntry import de.grimsi.gameyfin.pluginapi.gamemetadata.GameFeature import de.grimsi.gameyfin.pluginapi.gamemetadata.Genre import de.grimsi.gameyfin.pluginapi.gamemetadata.PlayerPerspective @@ -29,6 +30,10 @@ class Game( var release: Instant? = null, + var userRating: Int? = null, + + var criticRating: Int? = null, + @ManyToMany(cascade = [CascadeType.MERGE]) var publishers: Set? = null, @@ -60,5 +65,8 @@ class Game( val path: String, @OneToMany(cascade = [CascadeType.ALL], orphanRemoval = true) - var metadata: Map = emptyMap() + var metadata: Map = emptyMap(), + + @ElementCollection + var originalIds: Map = emptyMap() ) \ No newline at end of file diff --git a/plugin-api/src/main/kotlin/de/grimsi/gameyfin/pluginapi/gamemetadata/GameMetadata.kt b/plugin-api/src/main/kotlin/de/grimsi/gameyfin/pluginapi/gamemetadata/GameMetadata.kt index 6b78b23..ab135da 100644 --- a/plugin-api/src/main/kotlin/de/grimsi/gameyfin/pluginapi/gamemetadata/GameMetadata.kt +++ b/plugin-api/src/main/kotlin/de/grimsi/gameyfin/pluginapi/gamemetadata/GameMetadata.kt @@ -4,6 +4,7 @@ import java.net.URI import java.time.Instant class GameMetadata( + val originalId: String, val title: String, val description: String? = null, val coverUrl: URI? = null, diff --git a/plugins/igdb/src/main/kotlin/de/grimsi/gameyfin/plugins/igdb/IgdbPlugin.kt b/plugins/igdb/src/main/kotlin/de/grimsi/gameyfin/plugins/igdb/IgdbPlugin.kt index 2610739..3f1e630 100644 --- a/plugins/igdb/src/main/kotlin/de/grimsi/gameyfin/plugins/igdb/IgdbPlugin.kt +++ b/plugins/igdb/src/main/kotlin/de/grimsi/gameyfin/plugins/igdb/IgdbPlugin.kt @@ -120,6 +120,7 @@ class IgdbPlugin(wrapper: PluginWrapper) : GameyfinPlugin(wrapper) { } return GameMetadata( + originalId = game.slug, title = game.name, description = game.summary, coverUrl = Mapper.cover(game.cover), diff --git a/plugins/igdb/src/main/resources/MANIFEST.MF b/plugins/igdb/src/main/resources/MANIFEST.MF index ba33b38..3005ba6 100644 --- a/plugins/igdb/src/main/resources/MANIFEST.MF +++ b/plugins/igdb/src/main/resources/MANIFEST.MF @@ -2,5 +2,5 @@ Manifest-Version: 1.0 Plugin-Class: de.grimsi.gameyfin.plugins.igdb.IgdbPlugin Plugin-Id: igdb Plugin-Description: IGDB Metadata -Plugin-Version: 1.0.0-alpha2 +Plugin-Version: 1.0.0-alpha3 Plugin-Provider: grimsi diff --git a/plugins/steam/src/main/kotlin/de/grimsi/gameyfin/plugins/steam/SteamPlugin.kt b/plugins/steam/src/main/kotlin/de/grimsi/gameyfin/plugins/steam/SteamPlugin.kt index f75d779..1671c07 100644 --- a/plugins/steam/src/main/kotlin/de/grimsi/gameyfin/plugins/steam/SteamPlugin.kt +++ b/plugins/steam/src/main/kotlin/de/grimsi/gameyfin/plugins/steam/SteamPlugin.kt @@ -102,6 +102,7 @@ class SteamPlugin(wrapper: PluginWrapper) : GameyfinPlugin(wrapper) { // This is as much as I can get from the Steam Store API val metadata = GameMetadata( + originalId = id.toString(), title = game.name, description = game.detailedDescription, coverUrl = URI(game.headerImage), diff --git a/plugins/steam/src/main/resources/MANIFEST.MF b/plugins/steam/src/main/resources/MANIFEST.MF index 953a2f4..5e6aa4a 100644 --- a/plugins/steam/src/main/resources/MANIFEST.MF +++ b/plugins/steam/src/main/resources/MANIFEST.MF @@ -2,5 +2,5 @@ Manifest-Version: 1.0 Plugin-Class: de.grimsi.gameyfin.plugins.steam.SteamPlugin Plugin-Id: steam Plugin-Description: Steam Metadata -Plugin-Version: 1.0.0-alpha3 +Plugin-Version: 1.0.0-alpha4 Plugin-Provider: grimsi