diff --git a/komga/src/main/kotlin/org/gotson/komga/domain/service/BookAnalyzer.kt b/komga/src/main/kotlin/org/gotson/komga/domain/service/BookAnalyzer.kt index 2770d262..4b4aeab9 100644 --- a/komga/src/main/kotlin/org/gotson/komga/domain/service/BookAnalyzer.kt +++ b/komga/src/main/kotlin/org/gotson/komga/domain/service/BookAnalyzer.kt @@ -8,9 +8,7 @@ import org.gotson.komga.domain.model.Media import org.gotson.komga.domain.model.MediaNotReadyException import org.gotson.komga.infrastructure.image.ImageConverter import org.gotson.komga.infrastructure.mediacontainer.ContentDetector -import org.gotson.komga.infrastructure.mediacontainer.PdfExtractor -import org.gotson.komga.infrastructure.mediacontainer.RarExtractor -import org.gotson.komga.infrastructure.mediacontainer.ZipExtractor +import org.gotson.komga.infrastructure.mediacontainer.MediaContainerExtractor import org.springframework.stereotype.Service import java.util.* @@ -19,17 +17,13 @@ private val logger = KotlinLogging.logger {} @Service class BookAnalyzer( private val contentDetector: ContentDetector, - private val zipExtractor: ZipExtractor, - private val rarExtractor: RarExtractor, - private val pdfExtractor: PdfExtractor, + extractors: List, private val imageConverter: ImageConverter ) { - val supportedMediaTypes = mapOf( - "application/zip" to zipExtractor, - "application/x-rar-compressed" to rarExtractor, - "application/pdf" to pdfExtractor - ) + val supportedMediaTypes = extractors + .flatMap { e -> e.mediaTypes().map { it to e } } + .toMap() private val natSortComparator: Comparator = CaseInsensitiveSimpleNaturalComparator.getInstance() @@ -41,7 +35,7 @@ class BookAnalyzer( val mediaType = contentDetector.detectMediaType(book.path()) logger.info { "Detected media type: $mediaType" } - if (!supportedMediaTypes.keys.contains(mediaType)) + if (!supportedMediaTypes.containsKey(mediaType)) return Media(mediaType = mediaType, status = Media.Status.UNSUPPORTED, comment = "Media type $mediaType is not supported") val entries = try { diff --git a/komga/src/main/kotlin/org/gotson/komga/infrastructure/mediacontainer/MediaContainerExtractor.kt b/komga/src/main/kotlin/org/gotson/komga/infrastructure/mediacontainer/MediaContainerExtractor.kt index f1ad3be8..9fca1fcb 100644 --- a/komga/src/main/kotlin/org/gotson/komga/infrastructure/mediacontainer/MediaContainerExtractor.kt +++ b/komga/src/main/kotlin/org/gotson/komga/infrastructure/mediacontainer/MediaContainerExtractor.kt @@ -3,7 +3,8 @@ package org.gotson.komga.infrastructure.mediacontainer import org.gotson.komga.domain.model.MediaContainerEntry import java.nio.file.Path -abstract class MediaContainerExtractor { - abstract fun getEntries(path: Path): List - abstract fun getEntryStream(path: Path, entryName: String): ByteArray +interface MediaContainerExtractor { + fun mediaTypes(): List + fun getEntries(path: Path): List + fun getEntryStream(path: Path, entryName: String): ByteArray } diff --git a/komga/src/main/kotlin/org/gotson/komga/infrastructure/mediacontainer/PdfExtractor.kt b/komga/src/main/kotlin/org/gotson/komga/infrastructure/mediacontainer/PdfExtractor.kt index 3a775d43..b210f45c 100644 --- a/komga/src/main/kotlin/org/gotson/komga/infrastructure/mediacontainer/PdfExtractor.kt +++ b/komga/src/main/kotlin/org/gotson/komga/infrastructure/mediacontainer/PdfExtractor.kt @@ -11,12 +11,14 @@ import java.nio.file.Path import javax.imageio.ImageIO @Service -class PdfExtractor : MediaContainerExtractor() { +class PdfExtractor : MediaContainerExtractor { private val mediaType = "image/jpeg" private val imageIOFormat = "jpeg" private val resolution = 1536F + override fun mediaTypes(): List = listOf("application/pdf") + override fun getEntries(path: Path): List = Files.newInputStream(path).use { inputStream -> PDDocument.load(inputStream).use { pdf -> diff --git a/komga/src/main/kotlin/org/gotson/komga/infrastructure/mediacontainer/RarExtractor.kt b/komga/src/main/kotlin/org/gotson/komga/infrastructure/mediacontainer/RarExtractor.kt index 7d9b4098..a9920573 100644 --- a/komga/src/main/kotlin/org/gotson/komga/infrastructure/mediacontainer/RarExtractor.kt +++ b/komga/src/main/kotlin/org/gotson/komga/infrastructure/mediacontainer/RarExtractor.kt @@ -12,7 +12,9 @@ private val logger = KotlinLogging.logger {} @Service class RarExtractor( private val contentDetector: ContentDetector -) : MediaContainerExtractor() { +) : MediaContainerExtractor { + + override fun mediaTypes(): List = listOf("application/x-rar-compressed") override fun getEntries(path: Path): List = Archive(Files.newInputStream(path)).use { rar -> diff --git a/komga/src/main/kotlin/org/gotson/komga/infrastructure/mediacontainer/ZipExtractor.kt b/komga/src/main/kotlin/org/gotson/komga/infrastructure/mediacontainer/ZipExtractor.kt index 92bf4f90..81a561b1 100644 --- a/komga/src/main/kotlin/org/gotson/komga/infrastructure/mediacontainer/ZipExtractor.kt +++ b/komga/src/main/kotlin/org/gotson/komga/infrastructure/mediacontainer/ZipExtractor.kt @@ -11,7 +11,9 @@ private val logger = KotlinLogging.logger {} @Service class ZipExtractor( private val contentDetector: ContentDetector -) : MediaContainerExtractor() { +) : MediaContainerExtractor { + + override fun mediaTypes(): List = listOf("application/zip") override fun getEntries(path: Path): List = ZipFile(path.toFile()).use { zip -> diff --git a/komga/src/test/kotlin/org/gotson/komga/domain/service/BookAnalyzerTest.kt b/komga/src/test/kotlin/org/gotson/komga/domain/service/BookAnalyzerTest.kt index fc07d484..d441f807 100644 --- a/komga/src/test/kotlin/org/gotson/komga/domain/service/BookAnalyzerTest.kt +++ b/komga/src/test/kotlin/org/gotson/komga/domain/service/BookAnalyzerTest.kt @@ -8,19 +8,17 @@ import org.gotson.komga.domain.model.MediaContainerEntry import org.gotson.komga.domain.model.makeBook import org.gotson.komga.infrastructure.image.ImageConverter import org.gotson.komga.infrastructure.mediacontainer.ContentDetector -import org.gotson.komga.infrastructure.mediacontainer.PdfExtractor -import org.gotson.komga.infrastructure.mediacontainer.RarExtractor -import org.gotson.komga.infrastructure.mediacontainer.ZipExtractor +import org.gotson.komga.infrastructure.mediacontainer.MediaContainerExtractor import org.junit.jupiter.api.Test class BookAnalyzerTest { private val mockContent = mockk() - private val mockZip = mockk() - private val mockRar = mockk() - private val mockPDf = mockk() + private val mockZip = mockk().also { + every { it.mediaTypes() } returns listOf("application/zip") + } private val mockImageConverter = mockk() - private val bookAnalyzer = BookAnalyzer(mockContent, mockZip, mockRar, mockPDf, mockImageConverter) + private val bookAnalyzer = BookAnalyzer(mockContent, listOf(mockZip), mockImageConverter) @Test fun `given book with unordered pages when analyzing then thumbnail should always be the first in natural order`() {