From 368d0d51479e6befe7aafbe91384085407915f64 Mon Sep 17 00:00:00 2001 From: Gauthier Roebroeck Date: Fri, 4 Feb 2022 15:25:48 +0800 Subject: [PATCH] refactor: add MediaType enum --- .../org/gotson/komga/domain/model/MediaType.kt | 9 +++++++++ .../gotson/komga/domain/service/BookConverter.kt | 14 ++++++-------- .../infrastructure/mediacontainer/EpubExtractor.kt | 3 ++- .../infrastructure/mediacontainer/PdfExtractor.kt | 3 ++- .../infrastructure/mediacontainer/RarExtractor.kt | 3 ++- .../infrastructure/mediacontainer/ZipExtractor.kt | 3 ++- .../metadata/epub/EpubMetadataProvider.kt | 5 +++-- .../interfaces/api/rest/ReadListController.kt | 3 ++- .../komga/interfaces/api/rest/SeriesController.kt | 3 ++- 9 files changed, 30 insertions(+), 16 deletions(-) create mode 100644 komga/src/main/kotlin/org/gotson/komga/domain/model/MediaType.kt diff --git a/komga/src/main/kotlin/org/gotson/komga/domain/model/MediaType.kt b/komga/src/main/kotlin/org/gotson/komga/domain/model/MediaType.kt new file mode 100644 index 00000000..487209c3 --- /dev/null +++ b/komga/src/main/kotlin/org/gotson/komga/domain/model/MediaType.kt @@ -0,0 +1,9 @@ +package org.gotson.komga.domain.model + +enum class MediaType(val value: String, val fileExtension: String) { + ZIP("application/zip", "cbz"), + RAR_GENERIC("application/x-rar-compressed", "cbr"), + RAR_4("application/x-rar-compressed; version=4", "cbr"), + EPUB("application/epub+zip", "epub"), + PDF("application/pdf", "pdf"), +} diff --git a/komga/src/main/kotlin/org/gotson/komga/domain/service/BookConverter.kt b/komga/src/main/kotlin/org/gotson/komga/domain/service/BookConverter.kt index b8d2163c..13cab86b 100644 --- a/komga/src/main/kotlin/org/gotson/komga/domain/service/BookConverter.kt +++ b/komga/src/main/kotlin/org/gotson/komga/domain/service/BookConverter.kt @@ -10,6 +10,7 @@ import org.gotson.komga.domain.model.BookWithMedia import org.gotson.komga.domain.model.Library import org.gotson.komga.domain.model.Media import org.gotson.komga.domain.model.MediaNotReadyException +import org.gotson.komga.domain.model.MediaType import org.gotson.komga.domain.model.MediaUnsupportedException import org.gotson.komga.domain.persistence.BookRepository import org.gotson.komga.domain.persistence.LibraryRepository @@ -41,14 +42,11 @@ class BookConverter( private val transactionTemplate: TransactionTemplate, ) { - private val convertibleTypes = listOf("application/x-rar-compressed; version=4") + private val convertibleTypes = listOf(MediaType.RAR_4.value) - private val mediaTypeToExtension = mapOf( - "application/x-rar-compressed; version=4" to "cbr", - "application/zip" to "cbz", - "application/epub+zip" to "epub", - "application/pdf" to "pdf", - ) + private val mediaTypeToExtension = + listOf(MediaType.RAR_4, MediaType.ZIP, MediaType.PDF, MediaType.EPUB) + .associate { it.value to it.fileExtension } private val failedConversions = mutableListOf() private val skippedRepairs = mutableListOf() @@ -107,7 +105,7 @@ class BookConverter( convertedMedia.status != Media.Status.READY -> throw BookConversionException("Converted file could not be analyzed, aborting conversion") - convertedMedia.mediaType != "application/zip" + convertedMedia.mediaType != MediaType.ZIP.value -> throw BookConversionException("Converted file is not a zip file, aborting conversion") !convertedMedia.pages.map { FilenameUtils.getName(it.fileName) to it.mediaType } diff --git a/komga/src/main/kotlin/org/gotson/komga/infrastructure/mediacontainer/EpubExtractor.kt b/komga/src/main/kotlin/org/gotson/komga/infrastructure/mediacontainer/EpubExtractor.kt index a10a9e54..5507c3df 100644 --- a/komga/src/main/kotlin/org/gotson/komga/infrastructure/mediacontainer/EpubExtractor.kt +++ b/komga/src/main/kotlin/org/gotson/komga/infrastructure/mediacontainer/EpubExtractor.kt @@ -4,6 +4,7 @@ import mu.KotlinLogging import org.apache.commons.compress.archivers.ArchiveEntry import org.apache.commons.compress.archivers.zip.ZipFile import org.gotson.komga.domain.model.MediaContainerEntry +import org.gotson.komga.domain.model.MediaType import org.gotson.komga.domain.model.MediaUnsupportedException import org.gotson.komga.infrastructure.image.ImageAnalyzer import org.jsoup.Jsoup @@ -21,7 +22,7 @@ class EpubExtractor( private val imageAnalyzer: ImageAnalyzer, ) : MediaContainerExtractor { - override fun mediaTypes(): List = listOf("application/epub+zip") + override fun mediaTypes(): List = listOf(MediaType.EPUB.value) override fun getEntries(path: Path, analyzeDimensions: Boolean): List { ZipFile(path.toFile()).use { zip -> 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 673871d6..0c146f7c 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 @@ -9,6 +9,7 @@ import org.apache.pdfbox.rendering.ImageType import org.apache.pdfbox.rendering.PDFRenderer import org.gotson.komga.domain.model.Dimension import org.gotson.komga.domain.model.MediaContainerEntry +import org.gotson.komga.domain.model.MediaType import org.springframework.stereotype.Service import java.io.ByteArrayOutputStream import java.nio.file.Path @@ -31,7 +32,7 @@ class PdfExtractor : MediaContainerExtractor { .evictionListener { _: Path?, pdf: PDDocument?, _ -> pdf?.close() } .build() - override fun mediaTypes(): List = listOf("application/pdf") + override fun mediaTypes(): List = listOf(MediaType.PDF.value) override fun getEntries(path: Path, analyzeDimensions: Boolean): List = PDDocument.load(path.toFile(), MemoryUsageSetting.setupTempFileOnly()).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 92b8e481..d74f7a82 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.MediaType import org.gotson.komga.domain.model.MediaUnsupportedException import org.gotson.komga.infrastructure.image.ImageAnalyzer import org.springframework.stereotype.Service @@ -19,7 +20,7 @@ class RarExtractor( private val natSortComparator: Comparator = CaseInsensitiveSimpleNaturalComparator.getInstance() - override fun mediaTypes(): List = listOf("application/x-rar-compressed", "application/x-rar-compressed; version=4") + override fun mediaTypes(): List = listOf(MediaType.RAR_GENERIC.value, MediaType.RAR_4.value) override fun getEntries(path: Path, analyzeDimensions: Boolean): List = Archive(path.toFile()).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 eaa20efc..fa930ad7 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 @@ -6,6 +6,7 @@ import net.greypanther.natsort.CaseInsensitiveSimpleNaturalComparator import org.apache.commons.compress.archivers.ArchiveEntry import org.apache.commons.compress.archivers.zip.ZipFile import org.gotson.komga.domain.model.MediaContainerEntry +import org.gotson.komga.domain.model.MediaType import org.gotson.komga.infrastructure.image.ImageAnalyzer import org.springframework.stereotype.Service import java.nio.file.Path @@ -27,7 +28,7 @@ class ZipExtractor( private val natSortComparator: Comparator = CaseInsensitiveSimpleNaturalComparator.getInstance() - override fun mediaTypes(): List = listOf("application/zip") + override fun mediaTypes(): List = listOf(MediaType.ZIP.value) override fun getEntries(path: Path, analyzeDimensions: Boolean): List = ZipFile(path.toFile()).use { zip -> 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 fa477b30..edb87732 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 @@ -5,6 +5,7 @@ import org.gotson.komga.domain.model.Author import org.gotson.komga.domain.model.BookMetadataPatch import org.gotson.komga.domain.model.BookMetadataPatchCapability import org.gotson.komga.domain.model.BookWithMedia +import org.gotson.komga.domain.model.MediaType import org.gotson.komga.domain.model.SeriesMetadata import org.gotson.komga.domain.model.SeriesMetadataPatch import org.gotson.komga.infrastructure.mediacontainer.EpubExtractor @@ -44,7 +45,7 @@ class EpubMetadataProvider( ) override fun getBookMetadataFromBook(book: BookWithMedia): BookMetadataPatch? { - if (book.media.mediaType != "application/epub+zip") return null + if (book.media.mediaType != MediaType.EPUB.value) return null epubExtractor.getPackageFile(book.book.path)?.let { packageFile -> val opf = Jsoup.parse(packageFile, "", Parser.xmlParser()) @@ -82,7 +83,7 @@ class EpubMetadataProvider( } override fun getSeriesMetadataFromBook(book: BookWithMedia): SeriesMetadataPatch? { - if (book.media.mediaType != "application/epub+zip") return null + 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/ReadListController.kt b/komga/src/main/kotlin/org/gotson/komga/interfaces/api/rest/ReadListController.kt index 45c28fc6..3cc07e55 100644 --- a/komga/src/main/kotlin/org/gotson/komga/interfaces/api/rest/ReadListController.kt +++ b/komga/src/main/kotlin/org/gotson/komga/interfaces/api/rest/ReadListController.kt @@ -14,6 +14,7 @@ import org.gotson.komga.domain.model.BookSearchWithReadProgress import org.gotson.komga.domain.model.DomainEvent import org.gotson.komga.domain.model.DuplicateNameException import org.gotson.komga.domain.model.Media +import org.gotson.komga.domain.model.MediaType.ZIP import org.gotson.komga.domain.model.ROLE_ADMIN import org.gotson.komga.domain.model.ROLE_FILE_DOWNLOAD import org.gotson.komga.domain.model.ReadList @@ -445,7 +446,7 @@ class ReadListController( .build() }, ) - .contentType(MediaType.parseMediaType("application/zip")) + .contentType(MediaType.parseMediaType(ZIP.value)) .body(streamingResponse) } ?: throw ResponseStatusException(HttpStatus.NOT_FOUND) } diff --git a/komga/src/main/kotlin/org/gotson/komga/interfaces/api/rest/SeriesController.kt b/komga/src/main/kotlin/org/gotson/komga/interfaces/api/rest/SeriesController.kt index 55306938..2ba2170f 100644 --- a/komga/src/main/kotlin/org/gotson/komga/interfaces/api/rest/SeriesController.kt +++ b/komga/src/main/kotlin/org/gotson/komga/interfaces/api/rest/SeriesController.kt @@ -20,6 +20,7 @@ import org.gotson.komga.domain.model.BookSearchWithReadProgress import org.gotson.komga.domain.model.DomainEvent import org.gotson.komga.domain.model.MarkSelectedPreference import org.gotson.komga.domain.model.Media +import org.gotson.komga.domain.model.MediaType.ZIP import org.gotson.komga.domain.model.ROLE_ADMIN import org.gotson.komga.domain.model.ROLE_FILE_DOWNLOAD import org.gotson.komga.domain.model.ReadStatus @@ -684,7 +685,7 @@ class SeriesController( .build() }, ) - .contentType(MediaType.parseMediaType("application/zip")) + .contentType(MediaType.parseMediaType(ZIP.value)) .body(streamingResponse) }