|
|
|
|
@@ -2,10 +2,9 @@ package net.halfbinary.prettyplayerapi.service
|
|
|
|
|
|
|
|
|
|
import com.mpatric.mp3agic.Mp3File
|
|
|
|
|
import io.github.oshai.kotlinlogging.KotlinLogging
|
|
|
|
|
import kotlinx.coroutines.coroutineScope
|
|
|
|
|
import kotlinx.coroutines.launch
|
|
|
|
|
import kotlinx.coroutines.*
|
|
|
|
|
import net.halfbinary.prettyplayerapi.exception.EnvironmentVariableNotFoundException
|
|
|
|
|
import net.halfbinary.prettyplayerapi.model.AlbumInfo
|
|
|
|
|
import net.halfbinary.prettyplayerapi.model.AlbumMetadata
|
|
|
|
|
import net.halfbinary.prettyplayerapi.repository.AlbumRepository
|
|
|
|
|
import org.springframework.stereotype.Service
|
|
|
|
|
import java.awt.Image
|
|
|
|
|
@@ -18,7 +17,8 @@ import kotlin.io.path.name
|
|
|
|
|
private val logger = KotlinLogging.logger {}
|
|
|
|
|
|
|
|
|
|
@Service
|
|
|
|
|
class AlbumCacheService(private val albumRepository: AlbumRepository) {
|
|
|
|
|
class AlbumCacheService(private val albumRepository: AlbumRepository,
|
|
|
|
|
private val ioDispatcher: CoroutineDispatcher = Dispatchers.IO) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
suspend fun doAlbumCache() {
|
|
|
|
|
@@ -32,7 +32,7 @@ class AlbumCacheService(private val albumRepository: AlbumRepository) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fun getAlbumCache(): LinkedHashMap<String, AlbumInfo> {
|
|
|
|
|
fun getAlbumCache(): LinkedHashMap<String, AlbumMetadata> {
|
|
|
|
|
return albumRepository.albumCache
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -53,7 +53,7 @@ class AlbumCacheService(private val albumRepository: AlbumRepository) {
|
|
|
|
|
coroutineScope {
|
|
|
|
|
launch {getAndWriteAlbumImageFile(it.first, folderHash, folder, refresh)}
|
|
|
|
|
}
|
|
|
|
|
Pair(folderHash, AlbumInfo(it.second.id3v2Tag.album, it.first.parent, folderHash))
|
|
|
|
|
Pair(folderHash, AlbumMetadata(it.second.id3v2Tag.album, it.first.parent, folderHash))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
albumRepository.albumCache = convertAlbumListToMapForCache(list)
|
|
|
|
|
@@ -79,7 +79,7 @@ class AlbumCacheService(private val albumRepository: AlbumRepository) {
|
|
|
|
|
return compareBy({ it.second.id3v2Tag.albumArtist }, {it.second.id3v2Tag.album}, {it.second.id3v2Tag.year})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fun convertAlbumListToMapForCache(list: List<Pair<String, AlbumInfo>>): java.util.LinkedHashMap<String, AlbumInfo> {
|
|
|
|
|
fun convertAlbumListToMapForCache(list: List<Pair<String, AlbumMetadata>>): java.util.LinkedHashMap<String, AlbumMetadata> {
|
|
|
|
|
val array = list.toTypedArray()
|
|
|
|
|
return linkedMapOf(*array)
|
|
|
|
|
}
|
|
|
|
|
@@ -90,20 +90,26 @@ class AlbumCacheService(private val albumRepository: AlbumRepository) {
|
|
|
|
|
if(refresh || !hashedFile.exists()) {
|
|
|
|
|
logger.debug { "No image for $folder, making one..." }
|
|
|
|
|
val imageByteStream = Mp3File(file).id3v2Tag.albumImage.inputStream()
|
|
|
|
|
val bufferedImage = ImageIO.read(imageByteStream)
|
|
|
|
|
val bufferedImage = withContext(ioDispatcher) {
|
|
|
|
|
ImageIO.read(imageByteStream)
|
|
|
|
|
}
|
|
|
|
|
val scaledImage = bufferedImage.getScaledInstance(300, 300, Image.SCALE_DEFAULT)
|
|
|
|
|
val outputImage = BufferedImage(300, 300, BufferedImage.TYPE_INT_RGB)
|
|
|
|
|
outputImage.graphics.drawImage(scaledImage, 0, 0, null)
|
|
|
|
|
withContext(ioDispatcher) {
|
|
|
|
|
ImageIO.write(outputImage, "jpg", hashedFile)
|
|
|
|
|
}
|
|
|
|
|
logger.trace { "Wrote new image file for $folder with hash $folderHash" }
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
companion object {
|
|
|
|
|
val ALBUM_ROOT_DIR = System.getenv("ALBUM_ROOT_DIR")
|
|
|
|
|
?: throw EnvironmentVariableNotFoundException("Environment variable `ALBUM_ROOT_DIR` does not exist, please specify.") //"q:\\CDs"
|
|
|
|
|
val ALBUM_ART_ROOT_DIR = System.getenv("ALBUM_ART_ROOT_DIR")
|
|
|
|
|
?: throw EnvironmentVariableNotFoundException("Environment variable `ALBUM_ART_ROOT_DIR` does not exist, please specify.") //"src/main/resources/images/"
|
|
|
|
|
private fun getEnv(envName: String): String {
|
|
|
|
|
return System.getenv(envName)
|
|
|
|
|
?: throw EnvironmentVariableNotFoundException(envName)
|
|
|
|
|
}
|
|
|
|
|
val ALBUM_ROOT_DIR = getEnv("ALBUM_ROOT_DIR") //"q:\\CDs"
|
|
|
|
|
val ALBUM_ART_ROOT_DIR = getEnv("ALBUM_ART_ROOT_DIR") //"src/main/resources/images/"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|