From d0a1c8375e9f20283d7f232a7537733c09602bd6 Mon Sep 17 00:00:00 2001 From: grimsi <9295182+grimsi@users.noreply.github.com> Date: Tue, 10 Jun 2025 13:11:36 +0200 Subject: [PATCH] Sort plugins by priority in UI --- .../core/download/DownloadProviderDto.kt | 1 + .../core/download/DownloadProviderEndpoint.kt | 2 +- .../gameyfin/core/download/DownloadService.kt | 2 ++ .../gameyfin/core/plugins/PluginEndpoint.kt | 2 +- .../gameyfin/core/plugins/PluginService.kt | 9 ++------- .../plugins/management/GameyfinPluginManager.kt | 5 +++++ .../core/wrapper/ConfigurableGameyfinPlugin.kt | 16 ++++++++-------- 7 files changed, 20 insertions(+), 17 deletions(-) diff --git a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/download/DownloadProviderDto.kt b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/download/DownloadProviderDto.kt index db7c7dc..eb1e59c 100644 --- a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/download/DownloadProviderDto.kt +++ b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/download/DownloadProviderDto.kt @@ -6,6 +6,7 @@ import com.fasterxml.jackson.annotation.JsonInclude data class DownloadProviderDto( val key: String, val name: String, + val priority: Int, val description: String, val shortDescription: String? = null ) diff --git a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/download/DownloadProviderEndpoint.kt b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/download/DownloadProviderEndpoint.kt index d38aacb..ce874bf 100644 --- a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/download/DownloadProviderEndpoint.kt +++ b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/download/DownloadProviderEndpoint.kt @@ -9,6 +9,6 @@ class DownloadProviderEndpoint( private val downloadService: DownloadService ) { fun getProviders(): List { - return downloadService.getProviders() + return downloadService.getProviders().sortedByDescending { it.priority } } } \ No newline at end of file diff --git a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/download/DownloadService.kt b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/download/DownloadService.kt index 81b9ab4..0404f70 100644 --- a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/download/DownloadService.kt +++ b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/download/DownloadService.kt @@ -17,11 +17,13 @@ class DownloadService( fun getProviders(): List { return downloadPlugins.map { val plugin = pluginManager.whichPlugin(it.javaClass.enclosingClass) + val managementEntry = pluginManager.getManagementEntry(plugin.pluginId) val descriptor = plugin.descriptor as GameyfinPluginDescriptor DownloadProviderDto( key = it.javaClass.name, name = descriptor.pluginName, + priority = managementEntry.priority, description = descriptor.pluginDescription, shortDescription = descriptor.pluginShortDescription, ) diff --git a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/plugins/PluginEndpoint.kt b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/plugins/PluginEndpoint.kt index 171f4c8..1f65268 100644 --- a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/plugins/PluginEndpoint.kt +++ b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/plugins/PluginEndpoint.kt @@ -24,7 +24,7 @@ class PluginEndpoint( else Flux.empty() } - fun getAll() = pluginService.getAll() + fun getAll() = pluginService.getAll().sortedByDescending { it.priority } fun enablePlugin(pluginId: String) = pluginService.enablePlugin(pluginId) diff --git a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/plugins/PluginService.kt b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/plugins/PluginService.kt index db87df1..8006762 100644 --- a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/plugins/PluginService.kt +++ b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/plugins/PluginService.kt @@ -85,7 +85,7 @@ class PluginService( fun setPluginPriorities(pluginPriorities: Map) { pluginPriorities.forEach { (pluginId, priority) -> - val pluginManagementEntry = getPluginManagementEntry(pluginId) + val pluginManagementEntry = pluginManager.getManagementEntry(pluginId) pluginManagementEntry.priority = priority pluginManagementRepository.save(pluginManagementEntry) } @@ -155,13 +155,8 @@ class PluginService( return pluginManager.validatePluginConfig(pluginId, configToValidate) } - private fun getPluginManagementEntry(pluginId: String): PluginManagementEntry { - return pluginManagementRepository.findByIdOrNull(pluginId) - ?: throw IllegalArgumentException("Plugin with ID $pluginId not found") - } - private fun toDto(pluginWrapper: PluginWrapper): PluginDto { - val pluginManagementEntry = getPluginManagementEntry(pluginWrapper.pluginId) + val pluginManagementEntry = pluginManager.getManagementEntry(pluginWrapper.pluginId) val hasLogo = try { when (pluginWrapper.plugin is GameyfinPlugin) { diff --git a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/plugins/management/GameyfinPluginManager.kt b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/plugins/management/GameyfinPluginManager.kt index 70800df..0c5dea9 100644 --- a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/plugins/management/GameyfinPluginManager.kt +++ b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/plugins/management/GameyfinPluginManager.kt @@ -209,6 +209,11 @@ class GameyfinPluginManager( .map { it.simpleName } } + fun getManagementEntry(pluginId: String): PluginManagementEntry { + return pluginManagementRepository.findByIdOrNull(pluginId) + ?: throw IllegalArgumentException("Plugin with ID $pluginId not found") + } + private fun configurePlugin(pluginWrapper: PluginWrapper) { val plugin = pluginWrapper.plugin if (plugin is Configurable) { diff --git a/plugin-api/src/main/kotlin/de/grimsi/gameyfin/pluginapi/core/wrapper/ConfigurableGameyfinPlugin.kt b/plugin-api/src/main/kotlin/de/grimsi/gameyfin/pluginapi/core/wrapper/ConfigurableGameyfinPlugin.kt index 9a565b2..325f973 100644 --- a/plugin-api/src/main/kotlin/de/grimsi/gameyfin/pluginapi/core/wrapper/ConfigurableGameyfinPlugin.kt +++ b/plugin-api/src/main/kotlin/de/grimsi/gameyfin/pluginapi/core/wrapper/ConfigurableGameyfinPlugin.kt @@ -55,6 +55,14 @@ abstract class ConfigurableGameyfinPlugin(wrapper: PluginWrapper) : GameyfinPlug } } + override fun config(key: String): T { + val value = optionalConfig(key) + if (value == null) { + throw PluginConfigError("Required configuration key '$key' is missing or has no value") + } + return value + } + private fun castConfigValue(meta: ConfigMetadata<*>, value: Any): Any? { val expectedType = meta.type @@ -98,14 +106,6 @@ abstract class ConfigurableGameyfinPlugin(wrapper: PluginWrapper) : GameyfinPlug } } - override fun config(key: String): T { - val value = optionalConfig(key) - if (value == null) { - throw PluginConfigError("Required configuration key '$key' is missing or has no value") - } - return value - } - private fun resolveMetadata(key: String): ConfigMetadata<*> { return configMetadata.find { it.key == key } ?: throw PluginConfigError("Unknown configuration key: $key")