diff --git a/.run/GameyfinApplication.run.xml b/.run/GameyfinApplication.run.xml
index 2dfa2a0..2b37e24 100644
--- a/.run/GameyfinApplication.run.xml
+++ b/.run/GameyfinApplication.run.xml
@@ -8,6 +8,7 @@
+
diff --git a/gameyfin/build.gradle.kts b/gameyfin/build.gradle.kts
index 93d3e79..8f66395 100644
--- a/gameyfin/build.gradle.kts
+++ b/gameyfin/build.gradle.kts
@@ -68,9 +68,6 @@ dependencies {
// Plugins
implementation(project(":plugin-api"))
- implementation("org.pf4j:pf4j-spring:${rootProject.extra["pf4jSpringVersion"]}") {
- exclude("org.slf4j")
- }
// Development
developmentOnly("org.springframework.boot:spring-boot-devtools")
@@ -88,6 +85,18 @@ dependencyManagement {
}
}
+// Task to copy the bundled plugin JARs to the plugins directory
+val copyPlugins by tasks.registering(Copy::class) {
+ // Directory where plugins will be copied
+ val pluginsDir = layout.buildDirectory.dir("plugins")
+ from(project(":plugins:igdb").tasks.named("jar"))
+ into(pluginsDir)
+}
+
+tasks.named("compileKotlin") {
+ dependsOn(copyPlugins)
+}
+
tasks.withType {
useJUnitPlatform()
-}
+}
\ No newline at end of file
diff --git a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/PluginManagerConfig.kt b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/PluginManagerConfig.kt
index 319c96f..6b051b0 100644
--- a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/PluginManagerConfig.kt
+++ b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/PluginManagerConfig.kt
@@ -1,11 +1,14 @@
package de.grimsi.gameyfin.core
-import org.pf4j.spring.SpringPluginManager
+import org.pf4j.DefaultPluginManager
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
+import java.nio.file.Path
@Configuration
class PluginManagerConfig {
+ private val pluginPath = Path.of("plugins")
+
@Bean
- fun pluginManager() = SpringPluginManager()
+ fun pluginManager() = DefaultPluginManager(pluginPath)
}
\ No newline at end of file
diff --git a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/GameService.kt b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/GameService.kt
index 2d9a78d..5f8c4ab 100644
--- a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/GameService.kt
+++ b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/GameService.kt
@@ -1,7 +1,10 @@
package de.grimsi.gameyfin.games
import de.grimsi.gameyfin.pluginapi.gamemetadata.GameMetadataPlugin
-import org.pf4j.spring.SpringPluginManager
+import io.github.oshai.kotlinlogging.KotlinLogging
+import org.pf4j.PluginManager
+import org.springframework.boot.context.event.ApplicationReadyEvent
+import org.springframework.context.event.EventListener
import org.springframework.data.repository.findByIdOrNull
import org.springframework.stereotype.Service
import java.nio.file.Path
@@ -9,11 +12,20 @@ import java.nio.file.Path
@Service
class GameService(
private val gameRepository: GameRepository,
- private val pluginManager: SpringPluginManager
+ private val pluginManager: PluginManager
) {
- val metadataPlugins: List
+ private val log = KotlinLogging.logger {}
+
+ private val metadataPlugins: List
get() = pluginManager.getExtensions(GameMetadataPlugin::class.java)
+ @EventListener(ApplicationReadyEvent::class)
+ fun loadedPlugins() {
+ pluginManager.loadPlugins()
+ pluginManager.startPlugins()
+ log.info { "Loaded metadata plugins: ${metadataPlugins.map { it::class.simpleName }}" }
+ }
+
fun createOrUpdate(game: Game): Game {
return gameRepository.save(game)
}
diff --git a/plugin-api/src/main/kotlin/de/grimsi/gameyfin/pluginapi/gamemetadata/GameMetadataPlugin.kt b/plugin-api/src/main/kotlin/de/grimsi/gameyfin/pluginapi/gamemetadata/GameMetadataPlugin.kt
index 96428ab..cecf755 100644
--- a/plugin-api/src/main/kotlin/de/grimsi/gameyfin/pluginapi/gamemetadata/GameMetadataPlugin.kt
+++ b/plugin-api/src/main/kotlin/de/grimsi/gameyfin/pluginapi/gamemetadata/GameMetadataPlugin.kt
@@ -1,6 +1,8 @@
package de.grimsi.gameyfin.pluginapi.gamemetadata
-interface GameMetadataPlugin {
+import org.pf4j.ExtensionPoint
+
+interface GameMetadataPlugin : ExtensionPoint {
fun getConfig(): Map
fun setConfig(config: Map)
fun fetchMetadata(gameId: String): GameMetadata
diff --git a/plugins/igdb/build.gradle.kts b/plugins/igdb/build.gradle.kts
index f80844d..844860c 100644
--- a/plugins/igdb/build.gradle.kts
+++ b/plugins/igdb/build.gradle.kts
@@ -1,5 +1,6 @@
plugins {
kotlin("jvm")
+ id("kotlin-kapt")
}
group = "de.grimsi.gameyfin.plugins"
@@ -12,6 +13,12 @@ dependencies {
implementation(project(":plugin-api"))
}
+tasks.jar {
+ manifest {
+ from("./src/main/resources/MANIFEST.MF")
+ }
+}
+
tasks.test {
useJUnitPlatform()
}
\ No newline at end of file
diff --git a/plugins/igdb/src/main/kotlin/de/grimsi/gameyfin/plugins/igdb/IgdbPlugin.kt b/plugins/igdb/src/main/kotlin/de/grimsi/gameyfin/plugins/igdb/IgdbPlugin.kt
index 6a2ff5e..eae22bf 100644
--- a/plugins/igdb/src/main/kotlin/de/grimsi/gameyfin/plugins/igdb/IgdbPlugin.kt
+++ b/plugins/igdb/src/main/kotlin/de/grimsi/gameyfin/plugins/igdb/IgdbPlugin.kt
@@ -2,8 +2,10 @@ package de.grimsi.gameyfin.plugins.igdb
import de.grimsi.gameyfin.pluginapi.gamemetadata.GameMetadata
import de.grimsi.gameyfin.pluginapi.gamemetadata.GameMetadataPlugin
+import org.pf4j.Extension
import java.time.Instant
+@Extension
class IgdbPlugin : GameMetadataPlugin {
override fun getConfig(): Map {
TODO("Not yet implemented")
diff --git a/plugins/igdb/src/main/resources/MANIFEST.MF b/plugins/igdb/src/main/resources/MANIFEST.MF
new file mode 100644
index 0000000..1caf394
--- /dev/null
+++ b/plugins/igdb/src/main/resources/MANIFEST.MF
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0
+Plugin-Id: igdb
+Plugin-Class: de.grimsi.gameyfin.plugins.igdb.IgdbPlugin
+Plugin-Version: 1.0.0
+Plugin-Provider: grimsi
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 5c6b8f4..dd2c5c6 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -18,4 +18,3 @@ pluginManagement {
include("gameyfin")
include("plugin-api")
include("plugins:igdb")
-findProject(":plugins:igdb")?.name = "igdb"