From 390baf15bb9f07432c668de67f1aa22a0e9b7585 Mon Sep 17 00:00:00 2001 From: Gauthier Roebroeck Date: Fri, 16 Aug 2019 22:00:06 +0800 Subject: [PATCH] zip/rar extractors filter out non-image files --- .../infrastructure/archive/ArchiveExtractor.kt | 1 - .../infrastructure/archive/ContentDetector.kt | 7 +++++++ .../infrastructure/archive/RarExtractor.kt | 5 ++++- .../infrastructure/archive/ZipExtractor.kt | 17 +++++++++++------ 4 files changed, 22 insertions(+), 8 deletions(-) diff --git a/komga/src/main/kotlin/org/gotson/komga/infrastructure/archive/ArchiveExtractor.kt b/komga/src/main/kotlin/org/gotson/komga/infrastructure/archive/ArchiveExtractor.kt index ca26cf6a5..7c39afd27 100644 --- a/komga/src/main/kotlin/org/gotson/komga/infrastructure/archive/ArchiveExtractor.kt +++ b/komga/src/main/kotlin/org/gotson/komga/infrastructure/archive/ArchiveExtractor.kt @@ -6,7 +6,6 @@ import java.nio.file.Path import java.util.* abstract class ArchiveExtractor { - protected val natSortComparator: Comparator = CaseInsensitiveSimpleNaturalComparator.getInstance() abstract fun getFilenames(path: Path): List diff --git a/komga/src/main/kotlin/org/gotson/komga/infrastructure/archive/ContentDetector.kt b/komga/src/main/kotlin/org/gotson/komga/infrastructure/archive/ContentDetector.kt index 508a810de..59096dadb 100644 --- a/komga/src/main/kotlin/org/gotson/komga/infrastructure/archive/ContentDetector.kt +++ b/komga/src/main/kotlin/org/gotson/komga/infrastructure/archive/ContentDetector.kt @@ -36,4 +36,11 @@ class ContentDetector( return mediaType.toString() } } + + fun isImage(stream: InputStream): Boolean = + try { + detectMediaType(stream).startsWith("image/") + } catch (ex: Exception) { + false + } } \ No newline at end of file diff --git a/komga/src/main/kotlin/org/gotson/komga/infrastructure/archive/RarExtractor.kt b/komga/src/main/kotlin/org/gotson/komga/infrastructure/archive/RarExtractor.kt index 1fe90eaad..67cd5bb61 100644 --- a/komga/src/main/kotlin/org/gotson/komga/infrastructure/archive/RarExtractor.kt +++ b/komga/src/main/kotlin/org/gotson/komga/infrastructure/archive/RarExtractor.kt @@ -7,13 +7,16 @@ import java.nio.file.Files import java.nio.file.Path @Service -class RarExtractor : ArchiveExtractor() { +class RarExtractor( + private val contentDetector: ContentDetector +) : ArchiveExtractor() { override fun getFilenames(path: Path): List { val archive = Archive(Files.newInputStream(path)) return archive.fileHeaders .filter { !it.isDirectory } + .filter { contentDetector.isImage(archive.getInputStream(it)) } .map { it.fileNameString } .sortedWith(natSortComparator) } diff --git a/komga/src/main/kotlin/org/gotson/komga/infrastructure/archive/ZipExtractor.kt b/komga/src/main/kotlin/org/gotson/komga/infrastructure/archive/ZipExtractor.kt index d453acd04..9b6170646 100644 --- a/komga/src/main/kotlin/org/gotson/komga/infrastructure/archive/ZipExtractor.kt +++ b/komga/src/main/kotlin/org/gotson/komga/infrastructure/archive/ZipExtractor.kt @@ -6,13 +6,18 @@ import java.nio.file.Path import java.util.zip.ZipFile @Service -class ZipExtractor : ArchiveExtractor() { +class ZipExtractor( + private val contentDetector: ContentDetector +) : ArchiveExtractor() { - override fun getFilenames(path: Path) = - ZipFile(path.toFile()).entries().toList() - .filter { !it.isDirectory } - .map { it.name } - .sortedWith(natSortComparator) + override fun getFilenames(path: Path): List { + val zip = ZipFile(path.toFile()) + return zip.entries().toList() + .filter { !it.isDirectory } + .filter { contentDetector.isImage(zip.getInputStream(it)) } + .map { it.name } + .sortedWith(natSortComparator) + } override fun getEntryStream(path: Path, entryName: String): InputStream = ZipFile(path.toFile()).let {