add full filename in OPDS entry acquisition link, which should help incorrectly implemented OPDS clients to see and download files properly

This commit is contained in:
Gauthier Roebroeck 2019-10-18 11:46:39 +08:00
parent 3a40429416
commit 0e5424de6a
7 changed files with 14 additions and 12 deletions

View file

@ -1,5 +1,6 @@
package org.gotson.komga.domain.model
import org.apache.commons.io.FilenameUtils
import java.net.URL
import java.nio.file.Path
import java.nio.file.Paths
@ -48,7 +49,9 @@ class Book(
field = value
}
fun filename(): String = FilenameUtils.getName(url.toString())
fun path(): Path = Paths.get(this.url.toURI())
override fun toString(): String = url.toURI().path
}
fun Book.path(): Path = Paths.get(this.url.toURI())

View file

@ -27,6 +27,6 @@ class Library(
var id: Long = 0
constructor(name: String, root: String) : this(name, Paths.get(root).toUri().toURL())
}
fun Library.path(): Path = Paths.get(this.root.toURI())
fun path(): Path = Paths.get(this.root.toURI())
}

View file

@ -8,7 +8,6 @@ import org.gotson.komga.domain.model.BookMetadata
import org.gotson.komga.domain.model.MetadataNotReadyException
import org.gotson.komga.domain.model.Status
import org.gotson.komga.domain.model.UnsupportedMediaTypeException
import org.gotson.komga.domain.model.path
import org.gotson.komga.infrastructure.archive.ContentDetector
import org.gotson.komga.infrastructure.archive.PdfExtractor
import org.gotson.komga.infrastructure.archive.RarExtractor

View file

@ -5,7 +5,6 @@ import org.gotson.komga.domain.model.DirectoryNotFoundException
import org.gotson.komga.domain.model.DuplicateNameException
import org.gotson.komga.domain.model.Library
import org.gotson.komga.domain.model.PathContainedInPath
import org.gotson.komga.domain.model.path
import org.gotson.komga.domain.persistence.LibraryRepository
import org.gotson.komga.domain.persistence.SeriesRepository
import org.springframework.stereotype.Service

View file

@ -217,7 +217,7 @@ class OpdsController(
links = listOf(
OpdsLinkImageThumbnail("image/jpeg", "/api/v1/series/${series.id}/books/$id/thumbnail"),
OpdsLinkImage(metadata.pages[0].mediaType, "/api/v1/series/${series.id}/books/$id/pages/1"),
OpdsLinkFileAcquisition(metadata.mediaType, "/api/v1/series/${series.id}/books/$id/file"),
OpdsLinkFileAcquisition(metadata.mediaType, "/api/v1/series/${series.id}/books/$id/file/${filename()}"),
OpdsLinkPageStreaming("image/jpeg", "/api/v1/series/${series.id}/books/$id/pages/{pageNumber}?convert=jpeg&zero_based=true", metadata.pages.size)
)
)

View file

@ -4,7 +4,6 @@ import com.fasterxml.jackson.annotation.JsonFormat
import com.github.klinq.jpaspec.`in`
import com.github.klinq.jpaspec.likeLower
import mu.KotlinLogging
import org.apache.commons.io.FilenameUtils
import org.gotson.komga.domain.model.Book
import org.gotson.komga.domain.model.MetadataNotReadyException
import org.gotson.komga.domain.model.Series
@ -147,7 +146,10 @@ class SeriesController(
} ?: throw ResponseStatusException(HttpStatus.NOT_FOUND)
}
@GetMapping("{seriesId}/books/{bookId}/file")
@GetMapping(value = [
"{seriesId}/books/{bookId}/file",
"{seriesId}/books/{bookId}/file/*"
])
fun getBookFile(
@PathVariable seriesId: Long,
@PathVariable bookId: Long
@ -158,7 +160,7 @@ class SeriesController(
ResponseEntity.ok()
.headers(HttpHeaders().apply {
contentDisposition = ContentDisposition.builder("attachment")
.filename(FilenameUtils.getName(book.url.toString()))
.filename(book.filename())
.build()
})
.contentType(getMediaTypeOrDefault(book.metadata.mediaType))

View file

@ -6,7 +6,6 @@ import io.mockk.slot
import org.assertj.core.api.Assertions.assertThat
import org.gotson.komga.domain.model.makeBook
import org.gotson.komga.domain.model.makeBookPage
import org.gotson.komga.domain.model.path
import org.gotson.komga.infrastructure.archive.ContentDetector
import org.gotson.komga.infrastructure.archive.PdfExtractor
import org.gotson.komga.infrastructure.archive.RarExtractor
@ -38,4 +37,4 @@ class BookParserTest {
// then
assertThat(thumbnailFile.captured).isEqualTo("01")
}
}
}