mirror of
https://github.com/gotson/komga.git
synced 2026-05-02 03:41:59 +02:00
fix(komga): better error handling during metadata refresh
Closes: #1311
This commit is contained in:
parent
d6246ed5fc
commit
8832a0d818
3 changed files with 44 additions and 20 deletions
|
|
@ -47,7 +47,12 @@ class BookMetadataLifecycle(
|
|||
|
||||
else -> {
|
||||
logger.debug { "Provider: ${provider.javaClass.simpleName}" }
|
||||
val patch = provider.getBookMetadataFromBook(BookWithMedia(book, media))
|
||||
val patch = try {
|
||||
provider.getBookMetadataFromBook(BookWithMedia(book, media))
|
||||
} catch (e: Exception) {
|
||||
logger.error(e) { "Error while getting metadata from ${provider.javaClass.simpleName} for book: $book" }
|
||||
null
|
||||
}
|
||||
|
||||
if (provider.shouldLibraryHandlePatch(library, MetadataPatchTarget.BOOK)) {
|
||||
handlePatchForBookMetadata(patch, book)
|
||||
|
|
|
|||
|
|
@ -53,7 +53,14 @@ class SeriesMetadataLifecycle(
|
|||
else -> {
|
||||
logger.debug { "Provider: ${provider.javaClass.simpleName}" }
|
||||
val patches = bookRepository.findAllBySeriesId(series.id)
|
||||
.mapNotNull { provider.getSeriesMetadataFromBook(BookWithMedia(it, mediaRepository.findById(it.id)), library) }
|
||||
.mapNotNull { book ->
|
||||
try {
|
||||
provider.getSeriesMetadataFromBook(BookWithMedia(book, mediaRepository.findById(book.id)), library)
|
||||
} catch (e: Exception) {
|
||||
logger.error(e) { "Error while getting metadata from ${provider.javaClass.simpleName} for book: $book" }
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
if (provider.shouldLibraryHandlePatch(library, MetadataPatchTarget.SERIES)) {
|
||||
handlePatchForSeriesMetadata(patches, series)
|
||||
|
|
@ -73,7 +80,12 @@ class SeriesMetadataLifecycle(
|
|||
logger.info { "Library is not set to import series metadata for this provider, skipping: ${provider.javaClass.simpleName}" }
|
||||
else -> {
|
||||
logger.debug { "Provider: ${provider.javaClass.simpleName}" }
|
||||
val patch = provider.getSeriesMetadata(series)
|
||||
val patch = try {
|
||||
provider.getSeriesMetadata(series)
|
||||
} catch (e: Exception) {
|
||||
logger.error(e) { "Error while getting metadata from ${provider::class.simpleName} for series: $series" }
|
||||
null
|
||||
}
|
||||
|
||||
if (provider.shouldLibraryHandlePatch(library, MetadataPatchTarget.SERIES)) {
|
||||
handlePatchForSeriesMetadata(patch, series)
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@ 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.Library
|
||||
import org.gotson.komga.domain.model.MediaProfile
|
||||
import org.gotson.komga.domain.model.MetadataPatchTarget
|
||||
import org.gotson.komga.domain.service.BookAnalyzer
|
||||
import org.gotson.komga.infrastructure.metadata.BookMetadataProvider
|
||||
|
|
@ -39,33 +40,39 @@ class IsbnBarcodeProvider(
|
|||
setOf(BookMetadataPatchCapability.ISBN)
|
||||
|
||||
override fun getBookMetadataFromBook(book: BookWithMedia): BookMetadataPatch? {
|
||||
if (book.media.profile == MediaProfile.EPUB) return null
|
||||
|
||||
val pagesToTry = (1..book.media.pageCount).toList().let {
|
||||
(it.takeLast(PAGES_LAST).reversed() + it.take(PAGES_FIRST)).distinct()
|
||||
}
|
||||
|
||||
for (p in pagesToTry) {
|
||||
val imageBytes = bookAnalyzer.getPageContent(book, p)
|
||||
ImageIO.read(imageBytes.inputStream())?.let { image ->
|
||||
val pixels = image.getRGB(0, 0, image.width, image.height, null, 0, image.width)
|
||||
val source = RGBLuminanceSource(image.width, image.height, pixels)
|
||||
val bitmap = BinaryBitmap(HybridBinarizer(source))
|
||||
try {
|
||||
val imageBytes = bookAnalyzer.getPageContent(book, p)
|
||||
ImageIO.read(imageBytes.inputStream())?.let { image ->
|
||||
val pixels = image.getRGB(0, 0, image.width, image.height, null, 0, image.width)
|
||||
val source = RGBLuminanceSource(image.width, image.height, pixels)
|
||||
val bitmap = BinaryBitmap(HybridBinarizer(source))
|
||||
|
||||
val result = try {
|
||||
MultiFormatReader().decode(bitmap, hints)
|
||||
} catch (e: Exception) {
|
||||
null
|
||||
}
|
||||
val result = try {
|
||||
MultiFormatReader().decode(bitmap, hints)
|
||||
} catch (e: Exception) {
|
||||
null
|
||||
}
|
||||
|
||||
if (result == null || result.text == null) {
|
||||
logger.debug { "Book page $p does not contain a barcode: $book" }
|
||||
} else {
|
||||
if (validator.isValid(result.text)) {
|
||||
logger.debug { "Book page $p contains barcode which is valid ISBN: '${result.text}'. $book" }
|
||||
return BookMetadataPatch(isbn = validator.validate(result.text))
|
||||
if (result == null || result.text == null) {
|
||||
logger.debug { "Book page $p does not contain a barcode: $book" }
|
||||
} else {
|
||||
logger.debug { "Book page $p contains barcode which is invalid ISBN: '${result.text}'. $book" }
|
||||
if (validator.isValid(result.text)) {
|
||||
logger.debug { "Book page $p contains barcode which is valid ISBN: '${result.text}'. $book" }
|
||||
return BookMetadataPatch(isbn = validator.validate(result.text))
|
||||
} else {
|
||||
logger.debug { "Book page $p contains barcode which is invalid ISBN: '${result.text}'. $book" }
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
logger.error(e) { "Error while processing page" }
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue