From 7fce903c0e0cf238b1dcac624b72853da73f37c6 Mon Sep 17 00:00:00 2001 From: grimsi <9295182+grimsi@users.noreply.github.com> Date: Wed, 2 Apr 2025 18:29:24 +0200 Subject: [PATCH] Fix plugin logo not loading in standalone build --- .../main/kotlin/de/grimsi/gameyfin/core/Utils.kt | 15 +++++++-------- .../plugins/management/PluginManagementService.kt | 3 +-- .../de/grimsi/gameyfin/media/ImageEndpoint.kt | 3 ++- .../gameyfin/pluginapi/core/GameyfinPlugin.kt | 5 ++--- 4 files changed, 12 insertions(+), 14 deletions(-) diff --git a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/Utils.kt b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/Utils.kt index c953e88..70fa700 100644 --- a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/Utils.kt +++ b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/Utils.kt @@ -1,13 +1,12 @@ package de.grimsi.gameyfin.core import org.apache.tika.Tika -import org.springframework.core.io.InputStreamResource +import org.springframework.core.io.ByteArrayResource import org.springframework.http.HttpHeaders import org.springframework.http.MediaType import org.springframework.http.ResponseEntity import org.springframework.web.context.request.RequestContextHolder import org.springframework.web.context.request.ServletRequestAttributes -import java.io.InputStream class Utils { @@ -32,21 +31,21 @@ class Utils { } } - fun inputStreamToResponseEntity(stream: InputStream?): ResponseEntity { - if (stream == null) return ResponseEntity.notFound().build() + fun inputStreamToResponseEntity(bytes: ByteArray?): ResponseEntity { + if (bytes == null) return ResponseEntity.notFound().build() - val inputStreamResource = InputStreamResource(stream) + val byteArrayResource = ByteArrayResource(bytes) val headers = HttpHeaders() - val contentLength = stream.available().toLong() - val contentType = tika.detect(stream) + val contentLength = bytes.size.toLong() + val contentType = tika.detect(bytes) headers.contentLength = contentLength headers.contentType = MediaType.parseMediaType(contentType) return ResponseEntity.ok() .headers(headers) - .body(inputStreamResource) + .body(byteArrayResource) } } } diff --git a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/plugins/management/PluginManagementService.kt b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/plugins/management/PluginManagementService.kt index 0d30db3..16a6b37 100644 --- a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/plugins/management/PluginManagementService.kt +++ b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/plugins/management/PluginManagementService.kt @@ -6,7 +6,6 @@ import org.pf4j.ExtensionPoint import org.pf4j.PluginWrapper import org.springframework.data.repository.findByIdOrNull import org.springframework.stereotype.Service -import java.io.InputStream @Service class PluginManagementService( @@ -71,7 +70,7 @@ class PluginManagementService( } } - fun getLogo(pluginId: String): InputStream? { + fun getLogo(pluginId: String): ByteArray? { val plugin = pluginManager.getPlugin(pluginId).plugin as GameyfinPlugin return plugin.getLogo() } diff --git a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/media/ImageEndpoint.kt b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/media/ImageEndpoint.kt index c4f297c..d974d05 100644 --- a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/media/ImageEndpoint.kt +++ b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/media/ImageEndpoint.kt @@ -8,6 +8,7 @@ import de.grimsi.gameyfin.games.entities.Image import de.grimsi.gameyfin.games.entities.ImageType import de.grimsi.gameyfin.users.UserService import jakarta.annotation.security.RolesAllowed +import org.springframework.core.io.ByteArrayResource import org.springframework.core.io.InputStreamResource import org.springframework.http.HttpHeaders import org.springframework.http.MediaType @@ -37,7 +38,7 @@ class ImageEndpoint( } @GetMapping("/plugins/{id}/logo") - fun getPluginLogo(@PathVariable("id") pluginId: String): ResponseEntity? { + fun getPluginLogo(@PathVariable("id") pluginId: String): ResponseEntity? { val logo = pluginManagementService.getLogo(pluginId) return Utils.inputStreamToResponseEntity(logo) } diff --git a/plugin-api/src/main/kotlin/de/grimsi/gameyfin/pluginapi/core/GameyfinPlugin.kt b/plugin-api/src/main/kotlin/de/grimsi/gameyfin/pluginapi/core/GameyfinPlugin.kt index ffc60a0..e60f7a8 100644 --- a/plugin-api/src/main/kotlin/de/grimsi/gameyfin/pluginapi/core/GameyfinPlugin.kt +++ b/plugin-api/src/main/kotlin/de/grimsi/gameyfin/pluginapi/core/GameyfinPlugin.kt @@ -2,7 +2,6 @@ package de.grimsi.gameyfin.pluginapi.core import org.pf4j.Plugin import org.pf4j.PluginWrapper -import java.io.InputStream abstract class GameyfinPlugin(wrapper: PluginWrapper) : Plugin(wrapper) { @@ -40,12 +39,12 @@ abstract class GameyfinPlugin(wrapper: PluginWrapper) : Plugin(wrapper) { return false } - fun getLogo(): InputStream? { + fun getLogo(): ByteArray? { for (format in SUPPORTED_LOGO_FORMATS) { val resourcePath = "$LOGO_FILE_NAME.$format" val inputStream = wrapper.pluginClassLoader.getResourceAsStream(resourcePath) if (inputStream != null) { - return inputStream + return inputStream.readAllBytes() } }