diff --git a/komga/src/main/kotlin/org/gotson/komga/domain/service/TransientBookLifecycle.kt b/komga/src/main/kotlin/org/gotson/komga/domain/service/TransientBookLifecycle.kt index 9f76dc0ed..101f72f0f 100644 --- a/komga/src/main/kotlin/org/gotson/komga/domain/service/TransientBookLifecycle.kt +++ b/komga/src/main/kotlin/org/gotson/komga/domain/service/TransientBookLifecycle.kt @@ -72,19 +72,23 @@ class TransientBookLifecycle( seriesMetadataProviders .flatMap { buildList { - if (it.supportsAppendVolume) add(it.getSeriesMetadataFromBook(bookWithMedia, true)?.title) - add(it.getSeriesMetadataFromBook(bookWithMedia, false)?.title) + if (it.supportsAppendVolume) add(it.getSeriesMetadataFromBook(bookWithMedia, true)?.title?.ifBlank { null }) + add(it.getSeriesMetadataFromBook(bookWithMedia, false)?.title?.ifBlank { null }) } }.filterNotNull() - val exactSearch = SearchCondition.AnyOfSeries(seriesNamesFromMetadata.map { SearchCondition.Title(SearchOperator.Is(it)) }) - val exactMatches = seriesRepository.findAll(exactSearch, SearchContext.ofAnonymousUser(), Pageable.unpaged()) val series = - if (!exactMatches.isEmpty) { - exactMatches.content.first() + if (seriesNamesFromMetadata.isNotEmpty()) { + val exactSearch = SearchCondition.AnyOfSeries(seriesNamesFromMetadata.map { SearchCondition.Title(SearchOperator.Is(it)) }) + val exactMatches = seriesRepository.findAll(exactSearch, SearchContext.ofAnonymousUser(), Pageable.unpaged()) + if (!exactMatches.isEmpty) { + exactMatches.content.first() + } else { + val containsSearch = SearchCondition.AnyOfSeries(seriesNamesFromMetadata.map { SearchCondition.Title(SearchOperator.Contains(it)) }) + seriesRepository.findAll(containsSearch, SearchContext.ofAnonymousUser(), Pageable.unpaged()).content.firstOrNull() + } } else { - val containsSearch = SearchCondition.AnyOfSeries(seriesNamesFromMetadata.map { SearchCondition.Title(SearchOperator.Contains(it)) }) - seriesRepository.findAll(containsSearch, SearchContext.ofAnonymousUser(), Pageable.unpaged()).content.firstOrNull() + null } return series?.id to number diff --git a/komga/src/test/kotlin/org/gotson/komga/domain/service/TransientBookLifecycleTest.kt b/komga/src/test/kotlin/org/gotson/komga/domain/service/TransientBookLifecycleTest.kt index a80ed0539..371da1d98 100644 --- a/komga/src/test/kotlin/org/gotson/komga/domain/service/TransientBookLifecycleTest.kt +++ b/komga/src/test/kotlin/org/gotson/komga/domain/service/TransientBookLifecycleTest.kt @@ -68,4 +68,48 @@ class TransientBookLifecycleTest( assertThat(seriesId).isEqualTo(seriesExact.id) assertThat(number).isEqualTo(15F) } + + @Test + fun `when getting metadata for transient book without series then no series is matched`() { + seriesLifecycle.createSeries(makeSeries("Batman and Robin", libraryId = library.id)) + val seriesExact = makeSeries("Batman", libraryId = library.id) + seriesLifecycle.createSeries(seriesExact) + seriesLifecycle.createSeries(makeSeries("Batman and Robin (2022)", libraryId = library.id)) + + val book = + TransientBook( + makeBook("whatever"), + Media(), + ) + + every { mockProvider.getBookMetadataFromBook(any()) } returns BookMetadataPatch(null, null, null, null, null, null, null, null, null, emptyList()) + every { mockProvider.getSeriesMetadataFromBook(any(), any()) } returns SeriesMetadataPatch(null, null, null, null, null, null, null, null, null, null, emptySet()) + + val (seriesId, number) = transientBookLifecycle.getMetadata(book) + + assertThat(seriesId).isNull() + assertThat(number).isNull() + } + + @Test + fun `when getting metadata for transient book with blank series then no series is matched`() { + seriesLifecycle.createSeries(makeSeries("Batman and Robin", libraryId = library.id)) + val seriesExact = makeSeries("Batman", libraryId = library.id) + seriesLifecycle.createSeries(seriesExact) + seriesLifecycle.createSeries(makeSeries("Batman and Robin (2022)", libraryId = library.id)) + + val book = + TransientBook( + makeBook("whatever"), + Media(), + ) + + every { mockProvider.getBookMetadataFromBook(any()) } returns BookMetadataPatch(null, null, null, null, null, null, null, null, null, emptyList()) + every { mockProvider.getSeriesMetadataFromBook(any(), any()) } returns SeriesMetadataPatch(" ", null, null, null, null, null, null, null, null, null, emptySet()) + + val (seriesId, number) = transientBookLifecycle.getMetadata(book) + + assertThat(seriesId).isNull() + assertThat(number).isNull() + } }