fix(komga): better error handling during metadata refresh

Closes: #1311
This commit is contained in:
Gauthier Roebroeck 2023-11-29 11:20:30 +08:00
parent d6246ed5fc
commit 8832a0d818
3 changed files with 44 additions and 20 deletions

View file

@ -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)

View file

@ -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)

View file

@ -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" }
}
}