diff --git a/komga-webui/src/components/dialogs/LibraryEditDialog.vue b/komga-webui/src/components/dialogs/LibraryEditDialog.vue index 0a4f9b7e1..82e9a0653 100644 --- a/komga-webui/src/components/dialogs/LibraryEditDialog.vue +++ b/komga-webui/src/components/dialogs/LibraryEditDialog.vue @@ -246,6 +246,12 @@ hide-details class="mx-4" /> + { logger.debug { "Provider: ${provider.javaClass.simpleName}" } val patches = bookRepository.findAllBySeriesId(series.id) - .mapNotNull { provider.getSeriesMetadataFromBook(BookWithMedia(it, mediaRepository.findById(it.id))) } + .mapNotNull { provider.getSeriesMetadataFromBook(BookWithMedia(it, mediaRepository.findById(it.id)), library) } if (provider.shouldLibraryHandlePatch(library, MetadataPatchTarget.SERIES)) { handlePatchForSeriesMetadata(patches, series) diff --git a/komga/src/main/kotlin/org/gotson/komga/infrastructure/jooq/LibraryDao.kt b/komga/src/main/kotlin/org/gotson/komga/infrastructure/jooq/LibraryDao.kt index fc87c59a0..aff728095 100644 --- a/komga/src/main/kotlin/org/gotson/komga/infrastructure/jooq/LibraryDao.kt +++ b/komga/src/main/kotlin/org/gotson/komga/infrastructure/jooq/LibraryDao.kt @@ -65,6 +65,7 @@ class LibraryDao( .set(l.IMPORT_COMICINFO_SERIES, library.importComicInfoSeries) .set(l.IMPORT_COMICINFO_COLLECTION, library.importComicInfoCollection) .set(l.IMPORT_COMICINFO_READLIST, library.importComicInfoReadList) + .set(l.IMPORT_COMICINFO_SERIES_APPEND_VOLUME, library.importComicInfoSeriesAppendVolume) .set(l.IMPORT_EPUB_BOOK, library.importEpubBook) .set(l.IMPORT_EPUB_SERIES, library.importEpubSeries) .set(l.IMPORT_MYLAR_SERIES, library.importMylarSeries) @@ -92,6 +93,7 @@ class LibraryDao( .set(l.IMPORT_COMICINFO_SERIES, library.importComicInfoSeries) .set(l.IMPORT_COMICINFO_COLLECTION, library.importComicInfoCollection) .set(l.IMPORT_COMICINFO_READLIST, library.importComicInfoReadList) + .set(l.IMPORT_COMICINFO_SERIES_APPEND_VOLUME, library.importComicInfoSeriesAppendVolume) .set(l.IMPORT_EPUB_BOOK, library.importEpubBook) .set(l.IMPORT_EPUB_SERIES, library.importEpubSeries) .set(l.IMPORT_MYLAR_SERIES, library.importMylarSeries) @@ -122,6 +124,7 @@ class LibraryDao( importComicInfoSeries = importComicinfoSeries, importComicInfoCollection = importComicinfoCollection, importComicInfoReadList = importComicinfoReadlist, + importComicInfoSeriesAppendVolume = importComicinfoSeriesAppendVolume, importEpubBook = importEpubBook, importEpubSeries = importEpubSeries, importMylarSeries = importMylarSeries, diff --git a/komga/src/main/kotlin/org/gotson/komga/infrastructure/metadata/SeriesMetadataFromBookProvider.kt b/komga/src/main/kotlin/org/gotson/komga/infrastructure/metadata/SeriesMetadataFromBookProvider.kt index 2169da1c7..b06659ac2 100644 --- a/komga/src/main/kotlin/org/gotson/komga/infrastructure/metadata/SeriesMetadataFromBookProvider.kt +++ b/komga/src/main/kotlin/org/gotson/komga/infrastructure/metadata/SeriesMetadataFromBookProvider.kt @@ -1,8 +1,9 @@ package org.gotson.komga.infrastructure.metadata import org.gotson.komga.domain.model.BookWithMedia +import org.gotson.komga.domain.model.Library import org.gotson.komga.domain.model.SeriesMetadataPatch interface SeriesMetadataFromBookProvider : MetadataProvider { - fun getSeriesMetadataFromBook(book: BookWithMedia): SeriesMetadataPatch? + fun getSeriesMetadataFromBook(book: BookWithMedia, library: Library): SeriesMetadataPatch? } 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 1a7e6a3af..fdefa5a73 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 @@ -113,7 +113,7 @@ class ComicInfoProvider( return null } - override fun getSeriesMetadataFromBook(book: BookWithMedia): SeriesMetadataPatch? { + override fun getSeriesMetadataFromBook(book: BookWithMedia, library: Library): SeriesMetadataPatch? { getComicInfo(book)?.let { comicInfo -> val readingDirection = when (comicInfo.manga) { Manga.NO -> SeriesMetadata.ReadingDirection.LEFT_TO_RIGHT @@ -122,7 +122,7 @@ class ComicInfoProvider( } val genres = comicInfo.genre?.split(',')?.mapNotNull { it.trim().ifBlank { null } } - val series = computeSeriesFromSeriesAndVolume(comicInfo.series, comicInfo.volume) + val series = if (library.importComicInfoSeriesAppendVolume) computeSeriesFromSeriesAndVolume(comicInfo.series, comicInfo.volume) else comicInfo.series return SeriesMetadataPatch( title = series, 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 188be5119..c3f0ca0b4 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 @@ -84,7 +84,7 @@ class EpubMetadataProvider( return null } - override fun getSeriesMetadataFromBook(book: BookWithMedia): SeriesMetadataPatch? { + override fun getSeriesMetadataFromBook(book: BookWithMedia, library: Library): SeriesMetadataPatch? { if (book.media.mediaType != MediaType.EPUB.value) return null epubExtractor.getPackageFile(book.book.path)?.let { packageFile -> val opf = Jsoup.parse(packageFile, "", Parser.xmlParser()) diff --git a/komga/src/main/kotlin/org/gotson/komga/interfaces/api/rest/LibraryController.kt b/komga/src/main/kotlin/org/gotson/komga/interfaces/api/rest/LibraryController.kt index 8742074a4..48e3b224d 100644 --- a/komga/src/main/kotlin/org/gotson/komga/interfaces/api/rest/LibraryController.kt +++ b/komga/src/main/kotlin/org/gotson/komga/interfaces/api/rest/LibraryController.kt @@ -82,6 +82,7 @@ class LibraryController( importComicInfoSeries = library.importComicInfoSeries, importComicInfoCollection = library.importComicInfoCollection, importComicInfoReadList = library.importComicInfoReadList, + importComicInfoSeriesAppendVolume = library.importComicInfoSeriesAppendVolume, importEpubBook = library.importEpubBook, importEpubSeries = library.importEpubSeries, importMylarSeries = library.importMylarSeries, @@ -126,6 +127,7 @@ class LibraryController( importComicInfoSeries = library.importComicInfoSeries, importComicInfoCollection = library.importComicInfoCollection, importComicInfoReadList = library.importComicInfoReadList, + importComicInfoSeriesAppendVolume = library.importComicInfoSeriesAppendVolume, importEpubBook = library.importEpubBook, importEpubSeries = library.importEpubSeries, importMylarSeries = library.importMylarSeries, diff --git a/komga/src/main/kotlin/org/gotson/komga/interfaces/api/rest/dto/LibraryCreationDto.kt b/komga/src/main/kotlin/org/gotson/komga/interfaces/api/rest/dto/LibraryCreationDto.kt index 5a60ee10e..a4b842237 100644 --- a/komga/src/main/kotlin/org/gotson/komga/interfaces/api/rest/dto/LibraryCreationDto.kt +++ b/komga/src/main/kotlin/org/gotson/komga/interfaces/api/rest/dto/LibraryCreationDto.kt @@ -9,6 +9,7 @@ data class LibraryCreationDto( val importComicInfoSeries: Boolean = true, val importComicInfoCollection: Boolean = true, val importComicInfoReadList: Boolean = true, + val importComicInfoSeriesAppendVolume: Boolean = true, val importEpubBook: Boolean = true, val importEpubSeries: Boolean = true, val importMylarSeries: Boolean = true, diff --git a/komga/src/main/kotlin/org/gotson/komga/interfaces/api/rest/dto/LibraryDto.kt b/komga/src/main/kotlin/org/gotson/komga/interfaces/api/rest/dto/LibraryDto.kt index 09157df74..405c3499f 100644 --- a/komga/src/main/kotlin/org/gotson/komga/interfaces/api/rest/dto/LibraryDto.kt +++ b/komga/src/main/kotlin/org/gotson/komga/interfaces/api/rest/dto/LibraryDto.kt @@ -11,6 +11,7 @@ data class LibraryDto( val importComicInfoSeries: Boolean, val importComicInfoCollection: Boolean, val importComicInfoReadList: Boolean, + val importComicInfoSeriesAppendVolume: Boolean, val importEpubBook: Boolean, val importEpubSeries: Boolean, val importMylarSeries: Boolean, @@ -36,6 +37,7 @@ fun Library.toDto(includeRoot: Boolean) = LibraryDto( importComicInfoSeries = importComicInfoSeries, importComicInfoCollection = importComicInfoCollection, importComicInfoReadList = importComicInfoReadList, + importComicInfoSeriesAppendVolume = importComicInfoSeriesAppendVolume, importEpubBook = importEpubBook, importEpubSeries = importEpubSeries, importMylarSeries = importMylarSeries, diff --git a/komga/src/main/kotlin/org/gotson/komga/interfaces/api/rest/dto/LibraryUpdateDto.kt b/komga/src/main/kotlin/org/gotson/komga/interfaces/api/rest/dto/LibraryUpdateDto.kt index f45cde464..51e1584a9 100644 --- a/komga/src/main/kotlin/org/gotson/komga/interfaces/api/rest/dto/LibraryUpdateDto.kt +++ b/komga/src/main/kotlin/org/gotson/komga/interfaces/api/rest/dto/LibraryUpdateDto.kt @@ -9,6 +9,7 @@ data class LibraryUpdateDto( val importComicInfoSeries: Boolean, val importComicInfoCollection: Boolean, val importComicInfoReadList: Boolean, + val importComicInfoSeriesAppendVolume: Boolean, val importEpubBook: Boolean, val importEpubSeries: Boolean, val importMylarSeries: Boolean, diff --git a/komga/src/test/kotlin/org/gotson/komga/infrastructure/jooq/LibraryDaoTest.kt b/komga/src/test/kotlin/org/gotson/komga/infrastructure/jooq/LibraryDaoTest.kt index cff44dc7a..fedf34729 100644 --- a/komga/src/test/kotlin/org/gotson/komga/infrastructure/jooq/LibraryDaoTest.kt +++ b/komga/src/test/kotlin/org/gotson/komga/infrastructure/jooq/LibraryDaoTest.kt @@ -34,7 +34,6 @@ class LibraryDaoTest( libraryDao.insert(library) val created = libraryDao.findById(library.id) - assertThat(created.id).isNotEqualTo(0) assertThat(created.createdDate).isCloseTo(now, offset) assertThat(created.lastModifiedDate).isCloseTo(now, offset) assertThat(created.name).isEqualTo(library.name) @@ -61,6 +60,7 @@ class LibraryDaoTest( importComicInfoSeries = false, importComicInfoBook = false, importComicInfoReadList = false, + importComicInfoSeriesAppendVolume = false, importMylarSeries = false, importBarcodeIsbn = false, importLocalArtwork = false, @@ -91,6 +91,7 @@ class LibraryDaoTest( assertThat(modified.importComicInfoSeries).isEqualTo(updated.importComicInfoSeries) assertThat(modified.importComicInfoBook).isEqualTo(updated.importComicInfoBook) assertThat(modified.importComicInfoReadList).isEqualTo(updated.importComicInfoReadList) + assertThat(modified.importComicInfoSeriesAppendVolume).isEqualTo(updated.importComicInfoSeriesAppendVolume) assertThat(modified.importBarcodeIsbn).isEqualTo(updated.importBarcodeIsbn) assertThat(modified.importLocalArtwork).isEqualTo(updated.importLocalArtwork) assertThat(modified.importMylarSeries).isEqualTo(updated.importMylarSeries) diff --git a/komga/src/test/kotlin/org/gotson/komga/infrastructure/metadata/comicrack/ComicInfoProviderTest.kt b/komga/src/test/kotlin/org/gotson/komga/infrastructure/metadata/comicrack/ComicInfoProviderTest.kt index 981f455b5..27f6c2711 100644 --- a/komga/src/test/kotlin/org/gotson/komga/infrastructure/metadata/comicrack/ComicInfoProviderTest.kt +++ b/komga/src/test/kotlin/org/gotson/komga/infrastructure/metadata/comicrack/ComicInfoProviderTest.kt @@ -10,6 +10,7 @@ import org.gotson.komga.domain.model.Media import org.gotson.komga.domain.model.SeriesMetadata import org.gotson.komga.domain.model.WebLink import org.gotson.komga.domain.model.makeBook +import org.gotson.komga.domain.model.makeLibrary import org.gotson.komga.domain.service.BookAnalyzer import org.gotson.komga.infrastructure.metadata.comicrack.dto.AgeRating import org.gotson.komga.infrastructure.metadata.comicrack.dto.ComicInfo @@ -329,6 +330,9 @@ class ComicInfoProviderTest { @Nested inner class Series { + + private val library = makeLibrary() + private val libraryNoAppend = library.copy(importComicInfoSeriesAppendVolume = false) @Test fun `given comicInfo when getting series metadata then metadata patch is valid`() { val comicInfo = ComicInfo().apply { @@ -344,7 +348,7 @@ class ComicInfoProviderTest { every { mockMapper.readValue(any(), ComicInfo::class.java) } returns comicInfo - val patch = comicInfoProvider.getSeriesMetadataFromBook(BookWithMedia(book, media))!! + val patch = comicInfoProvider.getSeriesMetadataFromBook(BookWithMedia(book, media), library)!! with(patch) { assertThat(title).isEqualTo("series") @@ -370,11 +374,17 @@ class ComicInfoProviderTest { every { mockMapper.readValue(any(), ComicInfo::class.java) } returns comicInfo - val patch = comicInfoProvider.getSeriesMetadataFromBook(BookWithMedia(book, media))!! + val patch = comicInfoProvider.getSeriesMetadataFromBook(BookWithMedia(book, media), library)!! with(patch) { assertThat(title).isEqualTo("series (2020)") } + + val patchNoAppend = comicInfoProvider.getSeriesMetadataFromBook(BookWithMedia(book, media), libraryNoAppend)!! + + with(patchNoAppend) { + assertThat(title).isEqualTo("series") + } } @Test @@ -386,11 +396,17 @@ class ComicInfoProviderTest { every { mockMapper.readValue(any(), ComicInfo::class.java) } returns comicInfo - val patch = comicInfoProvider.getSeriesMetadataFromBook(BookWithMedia(book, media))!! + val patch = comicInfoProvider.getSeriesMetadataFromBook(BookWithMedia(book, media), library)!! with(patch) { assertThat(title).isEqualTo("series") } + + val patchNoAppend = comicInfoProvider.getSeriesMetadataFromBook(BookWithMedia(book, media), libraryNoAppend)!! + + with(patchNoAppend) { + assertThat(title).isEqualTo("series") + } } @Test @@ -401,7 +417,7 @@ class ComicInfoProviderTest { every { mockMapper.readValue(any(), ComicInfo::class.java) } returns comicInfo - val patch = comicInfoProvider.getSeriesMetadataFromBook(BookWithMedia(book, media))!! + val patch = comicInfoProvider.getSeriesMetadataFromBook(BookWithMedia(book, media), library)!! with(patch) { assertThat(language).isNull() @@ -421,7 +437,7 @@ class ComicInfoProviderTest { every { mockMapper.readValue(any(), ComicInfo::class.java) } returns comicInfo - val patch = comicInfoProvider.getSeriesMetadataFromBook(BookWithMedia(book, media))!! + val patch = comicInfoProvider.getSeriesMetadataFromBook(BookWithMedia(book, media), library)!! with(patch) { assertThat(title).isNull() diff --git a/komga/src/test/kotlin/org/gotson/komga/infrastructure/metadata/epub/EpubMetadataProviderTest.kt b/komga/src/test/kotlin/org/gotson/komga/infrastructure/metadata/epub/EpubMetadataProviderTest.kt index 486d8e21e..a31962e17 100644 --- a/komga/src/test/kotlin/org/gotson/komga/infrastructure/metadata/epub/EpubMetadataProviderTest.kt +++ b/komga/src/test/kotlin/org/gotson/komga/infrastructure/metadata/epub/EpubMetadataProviderTest.kt @@ -10,6 +10,7 @@ import org.gotson.komga.domain.model.BookWithMedia import org.gotson.komga.domain.model.Media import org.gotson.komga.domain.model.SeriesMetadata import org.gotson.komga.domain.model.makeBook +import org.gotson.komga.domain.model.makeLibrary import org.gotson.komga.infrastructure.image.ImageAnalyzer import org.gotson.komga.infrastructure.mediacontainer.ContentDetector import org.gotson.komga.infrastructure.mediacontainer.EpubExtractor @@ -118,12 +119,14 @@ class EpubMetadataProviderTest { @Nested inner class Series { + private val library = makeLibrary() + @Test fun `given epub 3 opf when getting series metadata then metadata patch is valid`() { val opf = ClassPathResource("epub/Panik im Paradies.opf") every { mockExtractor.getPackageFile(any()) } returns opf.file.readText() - val patch = epubMetadataProvider.getSeriesMetadataFromBook(BookWithMedia(book, media)) + val patch = epubMetadataProvider.getSeriesMetadataFromBook(BookWithMedia(book, media), library) with(patch!!) { assertThat(title).isEqualTo("Die drei ??? Kids") @@ -140,7 +143,7 @@ class EpubMetadataProviderTest { val opf = ClassPathResource("epub/Die Drei 3.opf") every { mockExtractor.getPackageFile(any()) } returns opf.file.readText() - val patch = epubMetadataProvider.getSeriesMetadataFromBook(BookWithMedia(book, media)) + val patch = epubMetadataProvider.getSeriesMetadataFromBook(BookWithMedia(book, media), library) with(patch!!) { assertThat(title).isEqualTo("Die drei ??? Kids") @@ -157,7 +160,7 @@ class EpubMetadataProviderTest { val opf = ClassPathResource("epub/1979.opf") every { mockExtractor.getPackageFile(any()) } returns opf.file.readText() - val patch = epubMetadataProvider.getSeriesMetadataFromBook(BookWithMedia(book, media)) + val patch = epubMetadataProvider.getSeriesMetadataFromBook(BookWithMedia(book, media), library) with(patch!!) { assertThat(title).isNull()