From 0e928f812af302119b806aa487280f300c105dfb Mon Sep 17 00:00:00 2001 From: GRIMSIM Date: Wed, 18 Jun 2025 17:49:20 +0200 Subject: [PATCH] Use undocumented field release_date Close client on Plugin.stop() --- .../metadata/steamgriddb/SteamGridDbPlugin.kt | 7 ++++ .../steamgriddb/api/SteamGridDbApiClient.kt | 8 +++-- .../steamgriddb/dto/SteamGridDbGame.kt | 8 ++++- .../util/InstantEpochSecondsSerializer.kt | 33 +++++++++++++++++++ 4 files changed, 53 insertions(+), 3 deletions(-) create mode 100644 plugins/steamgriddb/src/main/kotlin/org/gameyfin/plugins/metadata/steamgriddb/util/InstantEpochSecondsSerializer.kt diff --git a/plugins/steamgriddb/src/main/kotlin/org/gameyfin/plugins/metadata/steamgriddb/SteamGridDbPlugin.kt b/plugins/steamgriddb/src/main/kotlin/org/gameyfin/plugins/metadata/steamgriddb/SteamGridDbPlugin.kt index c36fb97..8c25d0c 100644 --- a/plugins/steamgriddb/src/main/kotlin/org/gameyfin/plugins/metadata/steamgriddb/SteamGridDbPlugin.kt +++ b/plugins/steamgriddb/src/main/kotlin/org/gameyfin/plugins/metadata/steamgriddb/SteamGridDbPlugin.kt @@ -56,6 +56,11 @@ class SteamGridDbPlugin(wrapper: PluginWrapper) : ConfigurableGameyfinPlugin(wra } } + override fun stop() { + client?.close() + client = null + } + private suspend fun authenticate(apiKey: String? = null) { log.debug("Authenticating on SteamGridDB API...") @@ -83,6 +88,7 @@ class SteamGridDbPlugin(wrapper: PluginWrapper) : ConfigurableGameyfinPlugin(wra GameMetadata( originalId = game.id.toString(), title = game.name, + release = game.releaseDate, coverUrls = grids?.map { URI(it.url) }, headerUrls = heroes?.map { URI(it.url) } ) @@ -101,6 +107,7 @@ class SteamGridDbPlugin(wrapper: PluginWrapper) : ConfigurableGameyfinPlugin(wra return@runBlocking GameMetadata( originalId = game.id.toString(), title = game.name, + release = game.releaseDate, coverUrls = grids?.map { URI(it.url) }, headerUrls = heroes?.map { URI(it.url) } ) diff --git a/plugins/steamgriddb/src/main/kotlin/org/gameyfin/plugins/metadata/steamgriddb/api/SteamGridDbApiClient.kt b/plugins/steamgriddb/src/main/kotlin/org/gameyfin/plugins/metadata/steamgriddb/api/SteamGridDbApiClient.kt index b877852..341f97c 100644 --- a/plugins/steamgriddb/src/main/kotlin/org/gameyfin/plugins/metadata/steamgriddb/api/SteamGridDbApiClient.kt +++ b/plugins/steamgriddb/src/main/kotlin/org/gameyfin/plugins/metadata/steamgriddb/api/SteamGridDbApiClient.kt @@ -44,6 +44,10 @@ class SteamGridDbApiClient(private val apiKey: String) { return get("search/autocomplete/${term.encodeURLPath(encodeSlash = true, encodeEncoded = false)}", block).body() } + suspend fun game(gameId: Int, block: HttpRequestBuilder.() -> Unit = {}): SteamGridDbGameResult { + return get("games/id/$gameId", block).body() + } + suspend fun grids(gameId: Int, block: HttpRequestBuilder.() -> Unit = {}): SteamGridDbGridResult { return get("grids/game/$gameId") { url { @@ -59,8 +63,8 @@ class SteamGridDbApiClient(private val apiKey: String) { }.body() } - suspend fun game(gameId: Int, block: HttpRequestBuilder.() -> Unit = {}): SteamGridDbGameResult { - return get("games/id/$gameId", block).body() + fun close() { + client.close() } private suspend fun get(endpoint: String, block: HttpRequestBuilder.() -> Unit = {}): HttpResponse { diff --git a/plugins/steamgriddb/src/main/kotlin/org/gameyfin/plugins/metadata/steamgriddb/dto/SteamGridDbGame.kt b/plugins/steamgriddb/src/main/kotlin/org/gameyfin/plugins/metadata/steamgriddb/dto/SteamGridDbGame.kt index b9302bc..fb0db88 100644 --- a/plugins/steamgriddb/src/main/kotlin/org/gameyfin/plugins/metadata/steamgriddb/dto/SteamGridDbGame.kt +++ b/plugins/steamgriddb/src/main/kotlin/org/gameyfin/plugins/metadata/steamgriddb/dto/SteamGridDbGame.kt @@ -1,10 +1,16 @@ package org.gameyfin.plugins.metadata.steamgriddb.dto +import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import org.gameyfin.plugins.metadata.steamgriddb.util.InstantEpochSecondsSerializer +import java.time.Instant @Serializable data class SteamGridDbGame( val id: Int, - val name: String + val name: String, + @SerialName("release_date") + @Serializable(with = InstantEpochSecondsSerializer::class) + val releaseDate: Instant? = null ) \ No newline at end of file diff --git a/plugins/steamgriddb/src/main/kotlin/org/gameyfin/plugins/metadata/steamgriddb/util/InstantEpochSecondsSerializer.kt b/plugins/steamgriddb/src/main/kotlin/org/gameyfin/plugins/metadata/steamgriddb/util/InstantEpochSecondsSerializer.kt new file mode 100644 index 0000000..a6f728d --- /dev/null +++ b/plugins/steamgriddb/src/main/kotlin/org/gameyfin/plugins/metadata/steamgriddb/util/InstantEpochSecondsSerializer.kt @@ -0,0 +1,33 @@ +package org.gameyfin.plugins.metadata.steamgriddb.util + +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.KSerializer +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder +import java.time.Instant + +@OptIn(ExperimentalSerializationApi::class) +object InstantEpochSecondsSerializer : KSerializer { + override val descriptor: SerialDescriptor = + PrimitiveSerialDescriptor("InstantEpochSeconds", PrimitiveKind.LONG) + + override fun serialize(encoder: Encoder, value: Instant?) { + if (value == null) { + encoder.encodeNull() + } else { + encoder.encodeLong(value.epochSecond) + } + } + + override fun deserialize(decoder: Decoder): Instant? { + return if (decoder.decodeNotNullMark()) { + Instant.ofEpochSecond(decoder.decodeLong()) + } else { + decoder.decodeNull() + null + } + } +} \ No newline at end of file