mirror of
https://github.com/gotson/komga.git
synced 2025-12-21 16:03:03 +01:00
perf: only refresh relevant metadata providers on series sort
This commit is contained in:
parent
c95a8c1304
commit
3dccb9a6a7
10 changed files with 68 additions and 12 deletions
|
|
@ -1,5 +1,6 @@
|
|||
package org.gotson.komga.application.tasks
|
||||
|
||||
import org.gotson.komga.domain.model.BookMetadataPatchCapability
|
||||
import java.io.Serializable
|
||||
|
||||
sealed class Task : Serializable {
|
||||
|
|
@ -17,7 +18,7 @@ sealed class Task : Serializable {
|
|||
override fun uniqueId() = "GENERATE_BOOK_THUMBNAIL_$bookId"
|
||||
}
|
||||
|
||||
data class RefreshBookMetadata(val bookId: String) : Task() {
|
||||
data class RefreshBookMetadata(val bookId: String, val capabilities: List<BookMetadataPatchCapability>) : Task() {
|
||||
override fun uniqueId() = "REFRESH_BOOK_METADATA_$bookId"
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@ class TaskHandler(
|
|||
|
||||
is Task.RefreshBookMetadata ->
|
||||
bookRepository.findByIdOrNull(task.bookId)?.let {
|
||||
metadataLifecycle.refreshMetadata(it)
|
||||
metadataLifecycle.refreshMetadata(it, task.capabilities)
|
||||
taskReceiver.refreshSeriesMetadata(it.seriesId)
|
||||
} ?: logger.warn { "Cannot execute task $task: Book does not exist" }
|
||||
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ package org.gotson.komga.application.tasks
|
|||
|
||||
import mu.KotlinLogging
|
||||
import org.gotson.komga.domain.model.Book
|
||||
import org.gotson.komga.domain.model.BookMetadataPatchCapability
|
||||
import org.gotson.komga.domain.model.BookSearch
|
||||
import org.gotson.komga.domain.model.Library
|
||||
import org.gotson.komga.domain.model.Media
|
||||
|
|
@ -54,12 +55,18 @@ class TaskReceiver(
|
|||
submitTask(Task.GenerateBookThumbnail(bookId))
|
||||
}
|
||||
|
||||
fun refreshBookMetadata(bookId: String) {
|
||||
submitTask(Task.RefreshBookMetadata(bookId))
|
||||
fun refreshBookMetadata(
|
||||
bookId: String,
|
||||
capabilities: List<BookMetadataPatchCapability> = BookMetadataPatchCapability.values().toList()
|
||||
) {
|
||||
submitTask(Task.RefreshBookMetadata(bookId, capabilities))
|
||||
}
|
||||
|
||||
fun refreshBookMetadata(book: Book) {
|
||||
submitTask(Task.RefreshBookMetadata(book.id))
|
||||
fun refreshBookMetadata(
|
||||
book: Book,
|
||||
capabilities: List<BookMetadataPatchCapability> = BookMetadataPatchCapability.values().toList()
|
||||
) {
|
||||
submitTask(Task.RefreshBookMetadata(book.id, capabilities))
|
||||
}
|
||||
|
||||
fun refreshSeriesMetadata(seriesId: String) {
|
||||
|
|
|
|||
|
|
@ -18,3 +18,16 @@ data class BookMetadataPatch(
|
|||
val number: Int? = null
|
||||
)
|
||||
}
|
||||
|
||||
enum class BookMetadataPatchCapability {
|
||||
TITLE,
|
||||
SUMMARY,
|
||||
NUMBER,
|
||||
NUMBER_SORT,
|
||||
RELEASE_DATE,
|
||||
AUTHORS,
|
||||
TAGS,
|
||||
ISBN,
|
||||
READ_LISTS,
|
||||
THUMBNAILS,
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ package org.gotson.komga.domain.service
|
|||
import mu.KotlinLogging
|
||||
import org.gotson.komga.domain.model.Book
|
||||
import org.gotson.komga.domain.model.BookMetadataPatch
|
||||
import org.gotson.komga.domain.model.BookMetadataPatchCapability
|
||||
import org.gotson.komga.domain.model.ReadList
|
||||
import org.gotson.komga.domain.model.Series
|
||||
import org.gotson.komga.domain.model.SeriesCollection
|
||||
|
|
@ -46,16 +47,20 @@ class MetadataLifecycle(
|
|||
private val localArtworkProvider: LocalArtworkProvider
|
||||
) {
|
||||
|
||||
fun refreshMetadata(book: Book) {
|
||||
logger.info { "Refresh metadata for book: $book" }
|
||||
fun refreshMetadata(book: Book, capabilities: List<BookMetadataPatchCapability>) {
|
||||
logger.info { "Refresh metadata for book: $book with capabilities: $capabilities" }
|
||||
val media = mediaRepository.findById(book.id)
|
||||
|
||||
val library = libraryRepository.findById(book.libraryId)
|
||||
|
||||
bookMetadataProviders.forEach { provider ->
|
||||
when {
|
||||
provider is ComicInfoProvider && !library.importComicInfoBook && !library.importComicInfoReadList -> logger.info { "Library is not set to import book and read lists metadata from ComicInfo, skipping" }
|
||||
provider is EpubMetadataProvider && !library.importEpubBook -> logger.info { "Library is not set to import book metadata from Epub, skipping" }
|
||||
capabilities.intersect(provider.getCapabilities()).isEmpty() ->
|
||||
logger.info { "Provider does not support requested capabilities, skipping: $provider" }
|
||||
provider is ComicInfoProvider && !library.importComicInfoBook && !library.importComicInfoReadList ->
|
||||
logger.info { "Library is not set to import book and read lists metadata from ComicInfo, skipping" }
|
||||
provider is EpubMetadataProvider && !library.importEpubBook ->
|
||||
logger.info { "Library is not set to import book metadata from Epub, skipping" }
|
||||
else -> {
|
||||
logger.debug { "Provider: $provider" }
|
||||
val patch = provider.getBookMetadataFromBook(book, media)
|
||||
|
|
@ -75,7 +80,8 @@ class MetadataLifecycle(
|
|||
}
|
||||
}
|
||||
|
||||
if (library.importLocalArtwork) refreshMetadataLocalArtwork(book)
|
||||
if (library.importLocalArtwork && capabilities.contains(BookMetadataPatchCapability.THUMBNAILS))
|
||||
refreshMetadataLocalArtwork(book)
|
||||
}
|
||||
|
||||
private fun handlePatchForReadLists(
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ import org.gotson.komga.application.tasks.TaskReceiver
|
|||
import org.gotson.komga.domain.model.Book
|
||||
import org.gotson.komga.domain.model.BookMetadata
|
||||
import org.gotson.komga.domain.model.BookMetadataAggregation
|
||||
import org.gotson.komga.domain.model.BookMetadataPatchCapability
|
||||
import org.gotson.komga.domain.model.Media
|
||||
import org.gotson.komga.domain.model.Series
|
||||
import org.gotson.komga.domain.model.SeriesMetadata
|
||||
|
|
@ -68,10 +69,11 @@ class SeriesLifecycle(
|
|||
}
|
||||
bookMetadataRepository.updateMany(oldToNew.map { it.second })
|
||||
|
||||
// refresh metadata to reimport book number, else the series resorting would overwritei t
|
||||
oldToNew.forEach { (old, new) ->
|
||||
if (old.number != new.number || old.numberSort != new.numberSort) {
|
||||
logger.debug { "Metadata numbering has changed, refreshing metadata for book ${new.bookId} " }
|
||||
taskReceiver.refreshBookMetadata(new.bookId)
|
||||
taskReceiver.refreshBookMetadata(new.bookId, listOf(BookMetadataPatchCapability.NUMBER, BookMetadataPatchCapability.NUMBER_SORT))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,8 +2,10 @@ package org.gotson.komga.infrastructure.metadata
|
|||
|
||||
import org.gotson.komga.domain.model.Book
|
||||
import org.gotson.komga.domain.model.BookMetadataPatch
|
||||
import org.gotson.komga.domain.model.BookMetadataPatchCapability
|
||||
import org.gotson.komga.domain.model.Media
|
||||
|
||||
interface BookMetadataProvider {
|
||||
fun getCapabilities(): List<BookMetadataPatchCapability>
|
||||
fun getBookMetadataFromBook(book: Book, media: Media): BookMetadataPatch?
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@ import mu.KotlinLogging
|
|||
import org.apache.commons.validator.routines.ISBNValidator
|
||||
import org.gotson.komga.domain.model.Book
|
||||
import org.gotson.komga.domain.model.BookMetadataPatch
|
||||
import org.gotson.komga.domain.model.BookMetadataPatchCapability
|
||||
import org.gotson.komga.domain.model.Media
|
||||
import org.gotson.komga.domain.service.BookAnalyzer
|
||||
import org.gotson.komga.infrastructure.metadata.BookMetadataProvider
|
||||
|
|
@ -33,6 +34,9 @@ class IsbnBarcodeProvider(
|
|||
DecodeHintType.TRY_HARDER to true
|
||||
)
|
||||
|
||||
override fun getCapabilities(): List<BookMetadataPatchCapability> =
|
||||
listOf(BookMetadataPatchCapability.ISBN)
|
||||
|
||||
override fun getBookMetadataFromBook(book: Book, media: Media): BookMetadataPatch? {
|
||||
val pagesToTry = (1..media.pages.size).toList().let {
|
||||
(it.takeLast(PAGES_LAST).reversed() + it.take(PAGES_FIRST)).distinct()
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ import mu.KotlinLogging
|
|||
import org.gotson.komga.domain.model.Author
|
||||
import org.gotson.komga.domain.model.Book
|
||||
import org.gotson.komga.domain.model.BookMetadataPatch
|
||||
import org.gotson.komga.domain.model.BookMetadataPatchCapability
|
||||
import org.gotson.komga.domain.model.Media
|
||||
import org.gotson.komga.domain.model.SeriesMetadata
|
||||
import org.gotson.komga.domain.model.SeriesMetadataPatch
|
||||
|
|
@ -28,6 +29,17 @@ class ComicInfoProvider(
|
|||
private val bookAnalyzer: BookAnalyzer
|
||||
) : BookMetadataProvider, SeriesMetadataProvider {
|
||||
|
||||
override fun getCapabilities(): List<BookMetadataPatchCapability> =
|
||||
listOf(
|
||||
BookMetadataPatchCapability.TITLE,
|
||||
BookMetadataPatchCapability.SUMMARY,
|
||||
BookMetadataPatchCapability.NUMBER,
|
||||
BookMetadataPatchCapability.NUMBER_SORT,
|
||||
BookMetadataPatchCapability.RELEASE_DATE,
|
||||
BookMetadataPatchCapability.AUTHORS,
|
||||
BookMetadataPatchCapability.READ_LISTS,
|
||||
)
|
||||
|
||||
override fun getBookMetadataFromBook(book: Book, media: Media): BookMetadataPatch? {
|
||||
getComicInfo(book, media)?.let { comicInfo ->
|
||||
val releaseDate = comicInfo.year?.let {
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ package org.gotson.komga.infrastructure.metadata.epub
|
|||
import org.gotson.komga.domain.model.Author
|
||||
import org.gotson.komga.domain.model.Book
|
||||
import org.gotson.komga.domain.model.BookMetadataPatch
|
||||
import org.gotson.komga.domain.model.BookMetadataPatchCapability
|
||||
import org.gotson.komga.domain.model.Media
|
||||
import org.gotson.komga.domain.model.SeriesMetadata
|
||||
import org.gotson.komga.domain.model.SeriesMetadataPatch
|
||||
|
|
@ -29,6 +30,14 @@ class EpubMetadataProvider(
|
|||
"ill" to "penciller"
|
||||
)
|
||||
|
||||
override fun getCapabilities(): List<BookMetadataPatchCapability> =
|
||||
listOf(
|
||||
BookMetadataPatchCapability.TITLE,
|
||||
BookMetadataPatchCapability.SUMMARY,
|
||||
BookMetadataPatchCapability.RELEASE_DATE,
|
||||
BookMetadataPatchCapability.AUTHORS,
|
||||
)
|
||||
|
||||
override fun getBookMetadataFromBook(book: Book, media: Media): BookMetadataPatch? {
|
||||
if (media.mediaType != "application/epub+zip") return null
|
||||
epubExtractor.getPackageFile(book.path())?.let { packageFile ->
|
||||
|
|
|
|||
Loading…
Reference in a new issue