From f0b91c7ed88dc3d1e815d12636a777c5891f8174 Mon Sep 17 00:00:00 2001 From: grimsi <9295182+grimsi@users.noreply.github.com> Date: Fri, 16 May 2025 15:26:19 +0200 Subject: [PATCH] Fix bug where ExtensionFinder ignores disabled plugins --- .../components/general/covers/GameCover.tsx | 2 +- .../management/GameyfinExtensionFinder.kt | 63 +++++++++++++++++++ .../management/GameyfinPluginManager.kt | 6 ++ 3 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/plugins/management/GameyfinExtensionFinder.kt diff --git a/gameyfin/src/main/frontend/components/general/covers/GameCover.tsx b/gameyfin/src/main/frontend/components/general/covers/GameCover.tsx index 8dc2fcd..ac01c70 100644 --- a/gameyfin/src/main/frontend/components/general/covers/GameCover.tsx +++ b/gameyfin/src/main/frontend/components/general/covers/GameCover.tsx @@ -12,7 +12,7 @@ interface GameCoverProps { export function GameCover({game, size = 300, radius = "sm", hover = false}: GameCoverProps) { return ( Number.isInteger(game.coverId) ? ( -
+
{game.title}?> { + log.debug { "Finding extensions from plugin '$pluginId'" } + val result: MutableList?> = ArrayList() + + val classNames = findClassNames(pluginId) + if (classNames.isEmpty()) { + return result + } + + if (pluginId != null) { + log.trace { "Checking extensions from plugin '$pluginId'" } + } else { + log.trace { "Checking extensions from classpath" } + } + + val classLoader = + if (pluginId != null) pluginManager.getPluginClassLoader(pluginId) else javaClass.getClassLoader() + + for (className in classNames) { + try { + log.debug { "Loading class '$className' using class loader '$classLoader'" } + val extensionClass = classLoader.loadClass(className) + + val extensionWrapper: ExtensionWrapper<*> = createExtensionWrapper(extensionClass) + result.add(extensionWrapper) + log.debug { "Added extension '$className' with ordinal ${extensionWrapper.ordinal}" } + } catch (e: ClassNotFoundException) { + log.error(e) { e.message } + } catch (e: NoClassDefFoundError) { + log.error(e) { e.message } + } + } + + if (result.isEmpty()) { + log.debug { "No extensions found for plugin '$pluginId'" } + } else { + log.debug { "Found ${result.size} extensions for plugin '$pluginId'" } + } + + return result + } + + private fun createExtensionWrapper(extensionClass: Class<*>): ExtensionWrapper<*> { + val extensionAnnotation = findExtensionAnnotation(extensionClass) + val ordinal = extensionAnnotation?.ordinal ?: 0 + val descriptor = ExtensionDescriptor(ordinal, extensionClass) + + return ExtensionWrapper(descriptor, pluginManager.extensionFactory) + } +} \ No newline at end of file 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 397834f..0f1e5bc 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 @@ -66,6 +66,12 @@ class GameyfinPluginManager( return GameyfinManifestPluginDescriptorFinder() } + override fun createExtensionFinder(): ExtensionFinder? { + val extensionFinder = GameyfinExtensionFinder(this) + addPluginStateListener(extensionFinder) + return extensionFinder + } + override fun loadPluginFromPath(pluginPath: Path?): PluginWrapper? { val pluginWrapper = try { super.loadPluginFromPath(pluginPath)