fix(analyzer): better rar5 detection

update to tika-core: 1.24 which can detect the rar version in mediaType
rar5 is now marked as unsupported instead of error
This commit is contained in:
Gauthier Roebroeck 2020-04-16 21:39:18 +08:00
parent d86d3427bb
commit b07e9b9728
4 changed files with 24 additions and 59 deletions

View file

@ -1,6 +1,7 @@
export function getBookFormatFromMediaType (mediaType: string): BookFormat {
switch (mediaType) {
case 'application/x-rar-compressed':
case 'application/x-rar-compressed; version=4':
return { type: 'CBR', color: '#03A9F4' }
case 'application/zip':
return { type: 'CBZ', color: '#4CAF50' }

View file

@ -66,7 +66,7 @@ dependencies {
implementation("commons-io:commons-io:2.6")
implementation("org.apache.commons:commons-lang3:3.10")
implementation("org.apache.tika:tika-core:1.23")
implementation("org.apache.tika:tika-core:1.24")
implementation("org.apache.commons:commons-compress:1.20")
implementation("com.github.junrar:junrar:4.0.0")
implementation("org.apache.pdfbox:pdfbox:2.0.19")

View file

@ -18,7 +18,7 @@ class RarExtractor(
private val natSortComparator: Comparator<String> = CaseInsensitiveSimpleNaturalComparator.getInstance()
override fun mediaTypes(): List<String> = listOf("application/x-rar-compressed")
override fun mediaTypes(): List<String> = listOf("application/x-rar-compressed", "application/x-rar-compressed; version=4")
override fun getEntries(path: Path): List<MediaContainerEntry> =
Archive(Files.newInputStream(path)).use { rar ->

View file

@ -21,26 +21,17 @@ class BookAnalyzerTest(
@Autowired private val bookAnalyzer: BookAnalyzer
) {
@Test
fun `given rar4 archive when analyzing then media status is READY`() {
val file = ClassPathResource("archives/rar4.rar")
@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")
val book = Book("book", file.url, LocalDateTime.now())
val media = bookAnalyzer.analyze(book)
assertThat(media.mediaType).isEqualTo("application/x-rar-compressed")
assertThat(media.status).isEqualTo(Media.Status.READY)
assertThat(media.pages).hasSize(1)
}
@Test
fun `given rar4 solid archive when analyzing then media status is READY`() {
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")
assertThat(media.mediaType).isEqualTo("application/x-rar-compressed; version=4")
assertThat(media.status).isEqualTo(Media.Status.READY)
assertThat(media.pages).hasSize(1)
}
@ -52,57 +43,30 @@ class BookAnalyzerTest(
val media = bookAnalyzer.analyze(book)
assertThat(media.mediaType).isEqualTo("application/x-rar-compressed")
assertThat(media.mediaType).isEqualTo("application/x-rar-compressed; version=4")
assertThat(media.status).isEqualTo(Media.Status.ERROR)
}
@Test
fun `given rar5 archive when analyzing then media status is ERROR`() {
val file = ClassPathResource("archives/rar5.rar")
@ParameterizedTest
@ValueSource(strings = [
"rar5.rar", "rar5-solid.rar", "rar5-encrypted.rar"
])
fun `given rar5 archive when analyzing then media status is UNSUPPORTED`(fileName: String) {
val file = ClassPathResource("archives/$fileName")
val book = Book("book", file.url, LocalDateTime.now())
val media = bookAnalyzer.analyze(book)
assertThat(media.mediaType).isEqualTo("application/x-rar-compressed")
assertThat(media.status).isEqualTo(Media.Status.ERROR)
}
@Test
fun `given rar5 solid archive when analyzing then media status is ERROR`() {
val file = ClassPathResource("archives/rar5-solid.rar")
val book = Book("book", file.url, LocalDateTime.now())
val media = bookAnalyzer.analyze(book)
assertThat(media.mediaType).isEqualTo("application/x-rar-compressed")
assertThat(media.status).isEqualTo(Media.Status.ERROR)
}
@Test
fun `given rar5 encrypted archive when analyzing then media status is ERROR`() {
val file = ClassPathResource("archives/rar5-encrypted.rar")
val book = Book("book", file.url, LocalDateTime.now())
val media = bookAnalyzer.analyze(book)
assertThat(media.mediaType).isEqualTo("application/x-rar-compressed")
assertThat(media.status).isEqualTo(Media.Status.ERROR)
}
@Test
fun `given 7zip archive when analyzing then media status is UNSUPPORTED`() {
val file = ClassPathResource("archives/7zip.7z")
val book = Book("book", file.url, LocalDateTime.now())
val media = bookAnalyzer.analyze(book)
assertThat(media.mediaType).isEqualTo("application/x-7z-compressed")
assertThat(media.mediaType).isEqualTo("application/x-rar-compressed; version=5")
assertThat(media.status).isEqualTo(Media.Status.UNSUPPORTED)
}
@Test
fun `given 7zip encrypted archive when analyzing then media status is UNSUPPORTED`() {
val file = ClassPathResource("archives/7zip-encrypted.7z")
@ParameterizedTest
@ValueSource(strings = [
"7zip.7z", "7zip-encrypted.7z"
])
fun `given 7zip archive when analyzing then media status is UNSUPPORTED`(fileName: String) {
val file = ClassPathResource("archives/$fileName")
val book = Book("book", file.url, LocalDateTime.now())
val media = bookAnalyzer.analyze(book)