fix(comicinfo): avoid reading the file twice

This commit is contained in:
Gauthier Roebroeck 2020-04-08 17:15:23 +08:00
parent 253088b483
commit 1dab826622
5 changed files with 20 additions and 36 deletions

View file

@ -27,19 +27,17 @@ class MetadataLifecycle(
logger.info { "Refresh metadata for book: $book" }
val loadedBook = bookRepository.findByIdOrNull(book.id)
loadedBook?.let { b ->
val patch = comicInfoProvider.getBookMetadataFromBook(b)
loadedBook?.let { bookToPatch ->
val patch = comicInfoProvider.getBookMetadataFromBook(bookToPatch)
patch?.let {
metadataApplier.apply(it, b)
bookRepository.save(b)
}
patch?.let { bPatch ->
metadataApplier.apply(bPatch, bookToPatch)
bookRepository.save(bookToPatch)
val seriesPatch = comicInfoProvider.getSeriesMetadataFromBook(b)
seriesPatch?.let {
metadataApplier.apply(it, b.series)
seriesRepository.save(b.series)
bPatch.series?.let { sPatch ->
metadataApplier.apply(sPatch, bookToPatch.series)
seriesRepository.save(bookToPatch.series)
}
}
}
}

View file

@ -11,5 +11,6 @@ class BookMetadataPatch(
val publisher: String?,
val ageRating: Int?,
val releaseDate: LocalDate?,
val authors: List<Author>?
val authors: List<Author>?,
val series: SeriesMetadataPatch?
)

View file

@ -1,8 +0,0 @@
package org.gotson.komga.infrastructure.metadata
import org.gotson.komga.domain.model.Book
import org.gotson.komga.domain.model.SeriesMetadataPatch
interface SeriesMetadataProvider {
fun getSeriesMetadataFromBook(book: Book): SeriesMetadataPatch?
}

View file

@ -9,7 +9,6 @@ import org.gotson.komga.domain.model.BookMetadataPatch
import org.gotson.komga.domain.model.SeriesMetadataPatch
import org.gotson.komga.domain.service.BookAnalyzer
import org.gotson.komga.infrastructure.metadata.BookMetadataProvider
import org.gotson.komga.infrastructure.metadata.SeriesMetadataProvider
import org.gotson.komga.infrastructure.metadata.comicinfo.dto.ComicInfo
import org.gotson.komga.infrastructure.metadata.comicinfo.dto.Manga
import org.springframework.beans.factory.annotation.Autowired
@ -24,7 +23,7 @@ private const val COMIC_INFO = "ComicInfo.xml"
class ComicInfoProvider(
@Autowired(required = false) private val mapper: XmlMapper = XmlMapper(),
private val bookAnalyzer: BookAnalyzer
) : BookMetadataProvider, SeriesMetadataProvider {
) : BookMetadataProvider {
override fun getBookMetadataFromBook(book: Book): BookMetadataPatch? {
getComicInfo(book)?.let { comicInfo ->
@ -56,18 +55,12 @@ class ComicInfoProvider(
comicInfo.publisher,
comicInfo.ageRating?.ageRating,
releaseDate,
if (authors.isEmpty()) null else authors
)
}
return null
}
override fun getSeriesMetadataFromBook(book: Book): SeriesMetadataPatch? {
getComicInfo(book)?.let { comicInfo ->
return SeriesMetadataPatch(
comicInfo.series,
comicInfo.series,
null
if (authors.isEmpty()) null else authors,
SeriesMetadataPatch(
comicInfo.series,
comicInfo.series,
null
)
)
}
return null
@ -76,7 +69,7 @@ class ComicInfoProvider(
private fun getComicInfo(book: Book): ComicInfo? {
try {
if (book.media.files.none { it == COMIC_INFO }) {
logger.debug { "Book does not contain any $COMIC_INFO file: ${book.url}" }
logger.debug { "Book does not contain any $COMIC_INFO file: $book" }
return null
}

View file

@ -158,7 +158,7 @@ class ComicInfoProviderTest {
every { mockMapper.readValue(any<ByteArray>(), ComicInfo::class.java) } returns comicInfo
val patch = comicInfoProvider.getSeriesMetadataFromBook(book)
val patch = comicInfoProvider.getBookMetadataFromBook(book)!!.series
with(patch!!) {
assertThat(title).isEqualTo("series")