diff --git a/komga/src/main/kotlin/org/gotson/komga/domain/model/Exceptions.kt b/komga/src/main/kotlin/org/gotson/komga/domain/model/Exceptions.kt index 8e5dbaa5e..964f10b2b 100644 --- a/komga/src/main/kotlin/org/gotson/komga/domain/model/Exceptions.kt +++ b/komga/src/main/kotlin/org/gotson/komga/domain/model/Exceptions.kt @@ -1,6 +1,7 @@ package org.gotson.komga.domain.model class MediaNotReadyException : Exception() +class MediaUnsupportedException(message: String) : Exception(message) class ImageConversionException(message: String) : Exception(message) class DirectoryNotFoundException(message: String) : Exception(message) class DuplicateNameException(message: String) : Exception(message) 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 eec5ac401..8bc8ad648 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 @@ -5,6 +5,7 @@ import org.gotson.komga.domain.model.Book import org.gotson.komga.domain.model.BookPage import org.gotson.komga.domain.model.Media import org.gotson.komga.domain.model.MediaNotReadyException +import org.gotson.komga.domain.model.MediaUnsupportedException import org.gotson.komga.infrastructure.image.ImageConverter import org.gotson.komga.infrastructure.mediacontainer.ContentDetector import org.gotson.komga.infrastructure.mediacontainer.MediaContainerExtractor @@ -36,6 +37,8 @@ class BookAnalyzer( val entries = try { supportedMediaTypes.getValue(mediaType).getEntries(book.path()) + } catch (ex: MediaUnsupportedException) { + return Media(mediaType = mediaType, status = Media.Status.UNSUPPORTED, comment = ex.message) } catch (ex: Exception) { logger.error(ex) { "Error while analyzing book: $book" } return Media(mediaType = mediaType, status = Media.Status.ERROR, comment = ex.message) 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 9fca1fcb2..9ba72dc6b 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 @@ -1,10 +1,14 @@ package org.gotson.komga.infrastructure.mediacontainer import org.gotson.komga.domain.model.MediaContainerEntry +import org.gotson.komga.domain.model.MediaUnsupportedException import java.nio.file.Path interface MediaContainerExtractor { fun mediaTypes(): List + + @Throws(MediaUnsupportedException::class) fun getEntries(path: Path): List + fun getEntryStream(path: Path, entryName: String): ByteArray } 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 57248783f..8d7ae092e 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 @@ -4,6 +4,7 @@ import com.github.junrar.Archive import mu.KotlinLogging import net.greypanther.natsort.CaseInsensitiveSimpleNaturalComparator import org.gotson.komga.domain.model.MediaContainerEntry +import org.gotson.komga.domain.model.MediaUnsupportedException import org.springframework.stereotype.Service import java.nio.file.Files import java.nio.file.Path @@ -22,6 +23,9 @@ class RarExtractor( override fun getEntries(path: Path): List = Archive(Files.newInputStream(path)).use { rar -> + if (rar.mainHeader.isEncrypted) throw MediaUnsupportedException("Encrypted RAR archives are not supported") + if (rar.mainHeader.isSolid) throw MediaUnsupportedException("Solid RAR archives are not supported") + if (rar.mainHeader.isMultiVolume) throw MediaUnsupportedException("Multi-Volume RAR archives are not supported") rar.fileHeaders .filter { !it.isDirectory } .map { @@ -38,6 +42,6 @@ class RarExtractor( override fun getEntryStream(path: Path, entryName: String): ByteArray = Archive(Files.newInputStream(path)).use { rar -> val header = rar.fileHeaders.find { it.fileNameString == entryName } - rar.getInputStream(header).readBytes() + rar.getInputStream(header).readBytes() } } 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 86291bb60..f47afc696 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 @@ -21,30 +21,30 @@ class BookAnalyzerTest( @Autowired private val bookAnalyzer: BookAnalyzer ) { - @ParameterizedTest - @ValueSource(strings = [ - "rar4.rar", "rar4-solid.rar" - ]) - fun `given rar4 archive when analyzing then media status is READY`(fileName: String) { - val file = ClassPathResource("archives/$fileName") + @Test + fun `given rar4 archive when analyzing then media status is READY`() { + val file = ClassPathResource("archives/rar4.rar") val book = Book("book", file.url, LocalDateTime.now()) val media = bookAnalyzer.analyze(book) assertThat(media.mediaType).isEqualTo("application/x-rar-compressed; version=4") assertThat(media.status).isEqualTo(Media.Status.READY) - assertThat(media.pages).hasSize(1) + assertThat(media.pages).hasSize(3) } - @Test - fun `given rar4 encrypted archive when analyzing then media status is ERROR`() { - val file = ClassPathResource("archives/rar4-encrypted.rar") + @ParameterizedTest + @ValueSource(strings = [ + "rar4-solid.rar", "rar4-encrypted.rar" + ]) + fun `given rar4 solid or encrypted archive when analyzing then media status is UNSUPPORTED`(fileName: String) { + val file = ClassPathResource("archives/rar4-solid.rar") val book = Book("book", file.url, LocalDateTime.now()) val media = bookAnalyzer.analyze(book) assertThat(media.mediaType).isEqualTo("application/x-rar-compressed; version=4") - assertThat(media.status).isEqualTo(Media.Status.ERROR) + assertThat(media.status).isEqualTo(Media.Status.UNSUPPORTED) } @ParameterizedTest @@ -112,5 +112,4 @@ class BookAnalyzerTest( assertThat(media.status).isEqualTo(Media.Status.READY) assertThat(media.pages).hasSize(1) } - } diff --git a/komga/src/test/resources/archives/rar4-solid.rar b/komga/src/test/resources/archives/rar4-solid.rar index 7d054814c..1c25018ab 100644 Binary files a/komga/src/test/resources/archives/rar4-solid.rar and b/komga/src/test/resources/archives/rar4-solid.rar differ diff --git a/komga/src/test/resources/archives/rar4.rar b/komga/src/test/resources/archives/rar4.rar index 91d89064d..f7fae4577 100644 Binary files a/komga/src/test/resources/archives/rar4.rar and b/komga/src/test/resources/archives/rar4.rar differ diff --git a/komga/src/test/resources/archives/rar5-solid.rar b/komga/src/test/resources/archives/rar5-solid.rar index 52f72c1b3..6c6ecbe08 100644 Binary files a/komga/src/test/resources/archives/rar5-solid.rar and b/komga/src/test/resources/archives/rar5-solid.rar differ