From d12f3b3493e5c4b8145db13714a5da09d535eb86 Mon Sep 17 00:00:00 2001 From: Gauthier Roebroeck Date: Wed, 11 Sep 2024 11:17:09 +0800 Subject: [PATCH] feat(metadata): support multiple values in Web field from ComicInfo.xml Closes: #1639 --- .../metadata/comicrack/ComicInfoProvider.kt | 22 ++++++++-------- .../comicrack/ComicInfoProviderTest.kt | 25 +++++++++++++++++-- 2 files changed, 35 insertions(+), 12 deletions(-) diff --git a/komga/src/main/kotlin/org/gotson/komga/infrastructure/metadata/comicrack/ComicInfoProvider.kt b/komga/src/main/kotlin/org/gotson/komga/infrastructure/metadata/comicrack/ComicInfoProvider.kt index 5e0abc26b1..8707318f07 100644 --- a/komga/src/main/kotlin/org/gotson/komga/infrastructure/metadata/comicrack/ComicInfoProvider.kt +++ b/komga/src/main/kotlin/org/gotson/komga/infrastructure/metadata/comicrack/ComicInfoProvider.kt @@ -89,16 +89,18 @@ class ComicInfoProvider( } } - val link = - comicInfo.web?.let { - try { - val uri = URI(it) - listOf(WebLink(uri.host, uri)) - } catch (e: Exception) { - logger.error(e) { "Could not parse Web element as valid URI: $it" } - null + val links = + comicInfo.web + ?.split(" ") + ?.filter { it.isNotBlank() } + ?.mapNotNull { + try { + URI(it.trim()).let { uri -> WebLink(uri.host, uri) } + } catch (e: Exception) { + logger.error(e) { "Could not parse Web element as valid URI: $it" } + null + } } - } val tags = comicInfo.tags?.split(',')?.mapNotNull { it.trim().lowercase().ifBlank { null } } @@ -112,7 +114,7 @@ class ComicInfoProvider( releaseDate = releaseDate, authors = authors.ifEmpty { null }, readLists = readLists, - links = link, + links = links?.ifEmpty { null }, tags = if (!tags.isNullOrEmpty()) tags.toSet() else null, isbn = isbn, ) diff --git a/komga/src/test/kotlin/org/gotson/komga/infrastructure/metadata/comicrack/ComicInfoProviderTest.kt b/komga/src/test/kotlin/org/gotson/komga/infrastructure/metadata/comicrack/ComicInfoProviderTest.kt index 03d4b1c255..fdee1766ba 100644 --- a/komga/src/test/kotlin/org/gotson/komga/infrastructure/metadata/comicrack/ComicInfoProviderTest.kt +++ b/komga/src/test/kotlin/org/gotson/komga/infrastructure/metadata/comicrack/ComicInfoProviderTest.kt @@ -57,7 +57,7 @@ class ComicInfoProviderTest { alternateSeries = "story arc" alternateNumber = "5" storyArc = "one, two, three" - web = "https://www.comixology.com/Sandman/digital-comic/727888" + web = " https://www.comixology.com/Sandman/digital-comic/727888 https://www.comics.com/Sandman/digital-comic/727889 " tags = "dark, Occult" gtin = "9783440077894" } @@ -84,9 +84,9 @@ class ComicInfoProviderTest { ) assertThat(links) - .hasSize(1) .containsExactlyInAnyOrder( WebLink("www.comixology.com", URI("https://www.comixology.com/Sandman/digital-comic/727888")), + WebLink("www.comics.com", URI("https://www.comics.com/Sandman/digital-comic/727889")), ) assertThat(tags as Iterable) @@ -95,6 +95,25 @@ class ComicInfoProviderTest { } } + @Test + fun `given comicInfo with single link when getting book metadata then metadata patch is valid`() { + val comicInfo = + ComicInfo().apply { + web = "https://www.comixology.com/Sandman/digital-comic/727888" + } + + every { mockMapper.readValue(any(), ComicInfo::class.java) } returns comicInfo + + val patch = comicInfoProvider.getBookMetadataFromBook(BookWithMedia(book, media)) + + with(patch!!) { + assertThat(links) + .containsExactlyInAnyOrder( + WebLink("www.comixology.com", URI("https://www.comixology.com/Sandman/digital-comic/727888")), + ) + } + } + @Test fun `given comicInfo with StoryArcNumber when getting book metadata then metadata patch is valid`() { val comicInfo = @@ -236,6 +255,7 @@ class ComicInfoProviderTest { storyArc = "" penciller = "" gtin = "" + web = "" } every { mockMapper.readValue(any(), ComicInfo::class.java) } returns comicInfo @@ -250,6 +270,7 @@ class ComicInfoProviderTest { assertThat(authors).isNull() assertThat(readLists).isEmpty() assertThat(isbn).isNull() + assertThat(links).isNull() } }