Makes caching async
This commit is contained in:
parent
bb0cac8553
commit
9edcb5566b
@ -8,7 +8,7 @@ plugins {
|
|||||||
}
|
}
|
||||||
|
|
||||||
group = "net.halfbinary"
|
group = "net.halfbinary"
|
||||||
version = "0.0.8-SNAPSHOT"
|
version = "0.0.11-SNAPSHOT"
|
||||||
|
|
||||||
java {
|
java {
|
||||||
sourceCompatibility = JavaVersion.VERSION_21
|
sourceCompatibility = JavaVersion.VERSION_21
|
||||||
@ -32,6 +32,11 @@ val coroutinesVersion = "1.8.1"
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation("org.springframework.boot:spring-boot-starter-web")
|
implementation("org.springframework.boot:spring-boot-starter-web")
|
||||||
|
implementation("org.springframework.boot:spring-boot-starter-webflux")
|
||||||
|
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
|
||||||
|
implementation("io.projectreactor.kotlin:reactor-kotlin-extensions")
|
||||||
|
implementation("org.jetbrains.kotlin:kotlin-reflect")
|
||||||
|
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-reactor")
|
||||||
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
|
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
|
||||||
implementation("org.jetbrains.kotlin:kotlin-reflect")
|
implementation("org.jetbrains.kotlin:kotlin-reflect")
|
||||||
implementation("com.mpatric:mp3agic:$mp3agicVersion")
|
implementation("com.mpatric:mp3agic:$mp3agicVersion")
|
||||||
@ -43,6 +48,9 @@ dependencies {
|
|||||||
annotationProcessor("org.springframework.boot:spring-boot-configuration-processor")
|
annotationProcessor("org.springframework.boot:spring-boot-configuration-processor")
|
||||||
testImplementation("org.springframework.boot:spring-boot-starter-test")
|
testImplementation("org.springframework.boot:spring-boot-starter-test")
|
||||||
testImplementation("ch.qos.logback:logback-classic:$logbackVersion")
|
testImplementation("ch.qos.logback:logback-classic:$logbackVersion")
|
||||||
|
testImplementation("org.springframework.boot:spring-boot-starter-test")
|
||||||
|
testImplementation("io.projectreactor:reactor-test")
|
||||||
|
testImplementation("org.jetbrains.kotlin:kotlin-test-junit5")
|
||||||
testRuntimeOnly("org.junit.platform:junit-platform-launcher")
|
testRuntimeOnly("org.junit.platform:junit-platform-launcher")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -9,7 +9,7 @@ import org.springframework.web.bind.annotation.RestController
|
|||||||
@CrossOrigin
|
@CrossOrigin
|
||||||
class CacheController(private val albumCacheService: AlbumCacheService) {
|
class CacheController(private val albumCacheService: AlbumCacheService) {
|
||||||
@GetMapping("cache")
|
@GetMapping("cache")
|
||||||
fun refreshAlbumCache() {
|
suspend fun refreshAlbumCache() {
|
||||||
albumCacheService.refreshAlbumCache()
|
albumCacheService.refreshAlbumCache()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2,8 +2,8 @@ package net.halfbinary.prettyplayerapi.service
|
|||||||
|
|
||||||
import com.mpatric.mp3agic.Mp3File
|
import com.mpatric.mp3agic.Mp3File
|
||||||
import io.github.oshai.kotlinlogging.KotlinLogging
|
import io.github.oshai.kotlinlogging.KotlinLogging
|
||||||
|
import kotlinx.coroutines.coroutineScope
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.runBlocking
|
|
||||||
import net.halfbinary.prettyplayerapi.exception.EnvironmentVariableNotFoundException
|
import net.halfbinary.prettyplayerapi.exception.EnvironmentVariableNotFoundException
|
||||||
import net.halfbinary.prettyplayerapi.model.AlbumInfo
|
import net.halfbinary.prettyplayerapi.model.AlbumInfo
|
||||||
import net.halfbinary.prettyplayerapi.repository.AlbumRepository
|
import net.halfbinary.prettyplayerapi.repository.AlbumRepository
|
||||||
@ -20,8 +20,14 @@ private val logger = KotlinLogging.logger {}
|
|||||||
@Service
|
@Service
|
||||||
class AlbumCacheService(private val albumRepository: AlbumRepository) {
|
class AlbumCacheService(private val albumRepository: AlbumRepository) {
|
||||||
|
|
||||||
fun refreshAlbumCache() {
|
|
||||||
runBlocking{
|
suspend fun doAlbumCache() {
|
||||||
|
coroutineScope {
|
||||||
|
launch { cacheAlbums(false) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
suspend fun refreshAlbumCache() {
|
||||||
|
coroutineScope{
|
||||||
launch { cacheAlbums(true)}
|
launch { cacheAlbums(true)}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -43,7 +49,9 @@ class AlbumCacheService(private val albumRepository: AlbumRepository) {
|
|||||||
.map {
|
.map {
|
||||||
val folder = it.first.parentFile.toPath()
|
val folder = it.first.parentFile.toPath()
|
||||||
val folderHash = folder.name.hashCode().toString()
|
val folderHash = folder.name.hashCode().toString()
|
||||||
runBlocking { launch {getAndWriteAlbumImageFile(it.first, folderHash, folder, refresh)} }
|
coroutineScope {
|
||||||
|
launch {getAndWriteAlbumImageFile(it.first, folderHash, folder, refresh)}
|
||||||
|
}
|
||||||
Pair(folderHash, AlbumInfo(it.second.id3v2Tag.album, it.first.parent, folderHash))
|
Pair(folderHash, AlbumInfo(it.second.id3v2Tag.album, it.first.parent, folderHash))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -10,6 +10,7 @@ class MusicService(private val albumCacheService: AlbumCacheService) {
|
|||||||
val albumInfo = albumCacheService.getAlbumCache()[albumHash]
|
val albumInfo = albumCacheService.getAlbumCache()[albumHash]
|
||||||
return if(albumInfo != null) {
|
return if(albumInfo != null) {
|
||||||
File(albumInfo.albumFolder).listFiles()[trackNumber-1]
|
File(albumInfo.albumFolder).listFiles()[trackNumber-1]
|
||||||
|
File(albumInfo.albumFolder).listFiles().sortedBy { it.name }[trackNumber-1]
|
||||||
} else {
|
} else {
|
||||||
throw AlbumHashNotFoundException("Album hash $albumHash not found")
|
throw AlbumHashNotFoundException("Album hash $albumHash not found")
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,15 +1,26 @@
|
|||||||
package net.halfbinary.prettyplayerapi.service
|
package net.halfbinary.prettyplayerapi.service
|
||||||
|
|
||||||
import jakarta.annotation.PostConstruct
|
import io.github.oshai.kotlinlogging.KotlinLogging
|
||||||
|
import kotlinx.coroutines.coroutineScope
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
|
import org.springframework.boot.context.event.ApplicationStartedEvent
|
||||||
|
import org.springframework.context.event.EventListener
|
||||||
|
import org.springframework.scheduling.annotation.Async
|
||||||
import org.springframework.stereotype.Component
|
import org.springframework.stereotype.Component
|
||||||
|
|
||||||
|
private val logger = KotlinLogging.logger {}
|
||||||
@Component
|
@Component
|
||||||
class StartupService(private val albumCacheService: AlbumCacheService) {
|
class StartupService(private val albumCacheService: AlbumCacheService) {
|
||||||
|
|
||||||
@PostConstruct
|
@Async
|
||||||
fun onStartup() {
|
@EventListener(ApplicationStartedEvent::class)
|
||||||
albumCacheService.refreshAlbumCache()
|
suspend fun onStartup() {
|
||||||
|
coroutineScope {
|
||||||
|
launch {
|
||||||
|
logger.info { "Starting up..." }
|
||||||
|
albumCacheService.doAlbumCache()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user