perf: only refresh relevant metadata providers on series sort

This commit is contained in:
Gauthier Roebroeck 2021-03-22 14:58:05 +08:00
parent c95a8c1304
commit 3dccb9a6a7
10 changed files with 68 additions and 12 deletions

View file

@ -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"
}

View file

@ -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" }

View file

@ -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) {

View file

@ -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,
}

View file

@ -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(

View file

@ -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))
}
}
}

View file

@ -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?
}

View file

@ -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()

View file

@ -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 {

View file

@ -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 ->