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