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) ? (
-
+
?> {
+ 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)