From 3dccb9a6a7e6b51cbdbd85fc12fc4b001998864a Mon Sep 17 00:00:00 2001 From: Gauthier Roebroeck Date: Mon, 22 Mar 2021 14:58:05 +0800 Subject: [PATCH] perf: only refresh relevant metadata providers on series sort --- .../org/gotson/komga/application/tasks/Task.kt | 3 ++- .../komga/application/tasks/TaskHandler.kt | 2 +- .../komga/application/tasks/TaskReceiver.kt | 15 +++++++++++---- .../komga/domain/model/BookMetadataPatch.kt | 13 +++++++++++++ .../komga/domain/service/MetadataLifecycle.kt | 16 +++++++++++----- .../komga/domain/service/SeriesLifecycle.kt | 4 +++- .../metadata/BookMetadataProvider.kt | 2 ++ .../metadata/barcode/IsbnBarcodeProvider.kt | 4 ++++ .../metadata/comicrack/ComicInfoProvider.kt | 12 ++++++++++++ .../metadata/epub/EpubMetadataProvider.kt | 9 +++++++++ 10 files changed, 68 insertions(+), 12 deletions(-) diff --git a/komga/src/main/kotlin/org/gotson/komga/application/tasks/Task.kt b/komga/src/main/kotlin/org/gotson/komga/application/tasks/Task.kt index 50d9b6755..e9e0e1059 100644 --- a/komga/src/main/kotlin/org/gotson/komga/application/tasks/Task.kt +++ b/komga/src/main/kotlin/org/gotson/komga/application/tasks/Task.kt @@ -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) : Task() { override fun uniqueId() = "REFRESH_BOOK_METADATA_$bookId" } diff --git a/komga/src/main/kotlin/org/gotson/komga/application/tasks/TaskHandler.kt b/komga/src/main/kotlin/org/gotson/komga/application/tasks/TaskHandler.kt index 5fe7d0f03..101614d0b 100644 --- a/komga/src/main/kotlin/org/gotson/komga/application/tasks/TaskHandler.kt +++ b/komga/src/main/kotlin/org/gotson/komga/application/tasks/TaskHandler.kt @@ -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" } diff --git a/komga/src/main/kotlin/org/gotson/komga/application/tasks/TaskReceiver.kt b/komga/src/main/kotlin/org/gotson/komga/application/tasks/TaskReceiver.kt index a16b5391f..0b5d6d2f9 100644 --- a/komga/src/main/kotlin/org/gotson/komga/application/tasks/TaskReceiver.kt +++ b/komga/src/main/kotlin/org/gotson/komga/application/tasks/TaskReceiver.kt @@ -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.values().toList() + ) { + submitTask(Task.RefreshBookMetadata(bookId, capabilities)) } - fun refreshBookMetadata(book: Book) { - submitTask(Task.RefreshBookMetadata(book.id)) + fun refreshBookMetadata( + book: Book, + capabilities: List = BookMetadataPatchCapability.values().toList() + ) { + submitTask(Task.RefreshBookMetadata(book.id, capabilities)) } fun refreshSeriesMetadata(seriesId: String) { diff --git a/komga/src/main/kotlin/org/gotson/komga/domain/model/BookMetadataPatch.kt b/komga/src/main/kotlin/org/gotson/komga/domain/model/BookMetadataPatch.kt index b5f9480cf..1af57b341 100644 --- a/komga/src/main/kotlin/org/gotson/komga/domain/model/BookMetadataPatch.kt +++ b/komga/src/main/kotlin/org/gotson/komga/domain/model/BookMetadataPatch.kt @@ -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, +} diff --git a/komga/src/main/kotlin/org/gotson/komga/domain/service/MetadataLifecycle.kt b/komga/src/main/kotlin/org/gotson/komga/domain/service/MetadataLifecycle.kt index f2e5ed6e4..35c5342c7 100644 --- a/komga/src/main/kotlin/org/gotson/komga/domain/service/MetadataLifecycle.kt +++ b/komga/src/main/kotlin/org/gotson/komga/domain/service/MetadataLifecycle.kt @@ -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) { + 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( diff --git a/komga/src/main/kotlin/org/gotson/komga/domain/service/SeriesLifecycle.kt b/komga/src/main/kotlin/org/gotson/komga/domain/service/SeriesLifecycle.kt index 12826fb3d..6654b3457 100644 --- a/komga/src/main/kotlin/org/gotson/komga/domain/service/SeriesLifecycle.kt +++ b/komga/src/main/kotlin/org/gotson/komga/domain/service/SeriesLifecycle.kt @@ -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)) } } } diff --git a/komga/src/main/kotlin/org/gotson/komga/infrastructure/metadata/BookMetadataProvider.kt b/komga/src/main/kotlin/org/gotson/komga/infrastructure/metadata/BookMetadataProvider.kt index c7ab4cac7..085e9c112 100644 --- a/komga/src/main/kotlin/org/gotson/komga/infrastructure/metadata/BookMetadataProvider.kt +++ b/komga/src/main/kotlin/org/gotson/komga/infrastructure/metadata/BookMetadataProvider.kt @@ -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 fun getBookMetadataFromBook(book: Book, media: Media): BookMetadataPatch? } diff --git a/komga/src/main/kotlin/org/gotson/komga/infrastructure/metadata/barcode/IsbnBarcodeProvider.kt b/komga/src/main/kotlin/org/gotson/komga/infrastructure/metadata/barcode/IsbnBarcodeProvider.kt index 94aabfe13..bb92076c8 100644 --- a/komga/src/main/kotlin/org/gotson/komga/infrastructure/metadata/barcode/IsbnBarcodeProvider.kt +++ b/komga/src/main/kotlin/org/gotson/komga/infrastructure/metadata/barcode/IsbnBarcodeProvider.kt @@ -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 = + 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() diff --git a/komga/src/main/kotlin/org/gotson/komga/infrastructure/metadata/comicrack/ComicInfoProvider.kt b/komga/src/main/kotlin/org/gotson/komga/infrastructure/metadata/comicrack/ComicInfoProvider.kt index 8a3867866..882eb48cf 100644 --- a/komga/src/main/kotlin/org/gotson/komga/infrastructure/metadata/comicrack/ComicInfoProvider.kt +++ b/komga/src/main/kotlin/org/gotson/komga/infrastructure/metadata/comicrack/ComicInfoProvider.kt @@ -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 = + 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 { diff --git a/komga/src/main/kotlin/org/gotson/komga/infrastructure/metadata/epub/EpubMetadataProvider.kt b/komga/src/main/kotlin/org/gotson/komga/infrastructure/metadata/epub/EpubMetadataProvider.kt index 3c67d23f2..06e1bd6ba 100644 --- a/komga/src/main/kotlin/org/gotson/komga/infrastructure/metadata/epub/EpubMetadataProvider.kt +++ b/komga/src/main/kotlin/org/gotson/komga/infrastructure/metadata/epub/EpubMetadataProvider.kt @@ -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 = + 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 ->