feat: import ISBN from epub metadata, split authors on comma

This commit is contained in:
Gauthier Roebroeck 2021-03-22 15:46:15 +08:00
parent 9cb63b5798
commit 52fceecaa9

View file

@ -1,5 +1,6 @@
package org.gotson.komga.infrastructure.metadata.epub package org.gotson.komga.infrastructure.metadata.epub
import org.apache.commons.validator.routines.ISBNValidator
import org.gotson.komga.domain.model.Author import org.gotson.komga.domain.model.Author
import org.gotson.komga.domain.model.Book import org.gotson.komga.domain.model.Book
import org.gotson.komga.domain.model.BookMetadataPatch import org.gotson.komga.domain.model.BookMetadataPatch
@ -18,7 +19,8 @@ import java.time.format.DateTimeFormatter
@Service @Service
class EpubMetadataProvider( class EpubMetadataProvider(
private val epubExtractor: EpubExtractor private val epubExtractor: EpubExtractor,
private val isbnValidator: ISBNValidator
) : BookMetadataProvider, SeriesMetadataProvider { ) : BookMetadataProvider, SeriesMetadataProvider {
private val relators = mapOf( private val relators = mapOf(
@ -36,6 +38,7 @@ class EpubMetadataProvider(
BookMetadataPatchCapability.SUMMARY, BookMetadataPatchCapability.SUMMARY,
BookMetadataPatchCapability.RELEASE_DATE, BookMetadataPatchCapability.RELEASE_DATE,
BookMetadataPatchCapability.AUTHORS, BookMetadataPatchCapability.AUTHORS,
BookMetadataPatchCapability.ISBN,
) )
override fun getBookMetadataFromBook(book: Book, media: Media): BookMetadataPatch? { override fun getBookMetadataFromBook(book: Book, media: Media): BookMetadataPatch? {
@ -50,23 +53,28 @@ class EpubMetadataProvider(
val creatorRefines = opf.select("metadata > meta[property=role][scheme=marc:relators]") val creatorRefines = opf.select("metadata > meta[property=role][scheme=marc:relators]")
.associate { it.attr("refines").removePrefix("#") to it.text() } .associate { it.attr("refines").removePrefix("#") to it.text() }
val authors = opf.select("metadata > dc|creator") val authors = opf.select("metadata > dc|creator")
.mapNotNull { .flatMap { el ->
val name = it.text()?.ifBlank { null } val names = el.text()?.split(",")?.mapNotNull { it.trim().ifBlank { null } } ?: emptyList()
if (name == null) null if (names.isEmpty()) emptyList()
else { else {
val opfRole = it.attr("opf|role").ifBlank { null } val opfRole = el.attr("opf|role").ifBlank { null }
val id = it.attr("id").ifBlank { null } val id = el.attr("id").ifBlank { null }
val refineRole = creatorRefines[id]?.ifBlank { null } val refineRole = creatorRefines[id]?.ifBlank { null }
val role = opfRole ?: refineRole val role = opfRole ?: refineRole
Author(name, relators[role] ?: "writer") names.map { Author(it, relators[role] ?: "writer") }
} }
} }
val isbn = opf.select("metadata > dc|identifier")
?.mapNotNull { isbnValidator.validate(it.text()) }
?.firstOrNull()
return BookMetadataPatch( return BookMetadataPatch(
title = title, title = title,
summary = description, summary = description,
releaseDate = date, releaseDate = date,
authors = authors authors = authors.ifEmpty { null },
isbn = isbn,
) )
} }
return null return null